erm0l0v/django-fake-model

Table doesn't exist

Closed this issue · 2 comments

The following code fails:

from django_fake_model import models as f
from django.db import models
from django import test


class Foo(f.FakeModel):
    name = models.CharField(max_length=128)


class Bar(f.FakeModel):
    name = models.CharField(max_length=128)
    foo = models.ForeignKey(Foo, null=True, related_name="bars")


@Foo.fake_me
@Bar.fake_me
class RestLaterFilterTests(test.TestCase):

    @classmethod
    def setUpClass(cls):
        fs = [
            Foo.objects.create(name='f0'),
           ... more code ...

Versions:

  • Django version: 1.8.5
  • Python version: 3.4.4
  • django-fake-model version: 0.1.4

Traceback:

Traceback (most recent call last):
  File "/home/user/src/apps/rest_layer/tests.py", line 24, in setUpClass
    Foo.objects.create(name='f0'),
  File "/usr/local/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/query.py", line 348, in create
    obj.save(force_insert=True, using=self.db)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/base.py", line 734, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/base.py", line 762, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/base.py", line 846, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/base.py", line 885, in _do_insert
    using=using, raw=raw)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/query.py", line 920, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/local/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 974, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 124, in execute
    return self.cursor.execute(query, args)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 220, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorvalue
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 209, in execute
    r = self._query(query)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 371, in _query
    rowcount = self._do_query(q)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 335, in _do_query
    db.query(q)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/connections.py", line 280, in query
    _mysql.connection.query(self, query)
django.db.utils.ProgrammingError: (1146, "Table 'django_db.django_fake_models_foo' doesn't exist")

Hello, thank you for your issue. Please try to change base class from TestCase to TransactionTestCase. For more details check #1 issue.

I tried to use TransactionTestCase now, but seams setUpClass(cls) is called before the models gets faked. Tried changing to setUp(self)/tearDown(self) as well, but that gives me a series of other failures, including:

Error for first test case:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/django/test/testcases.py", line 182, in __call__
    self._pre_setup()
  File "/usr/local/lib/python3.4/site-packages/django/test/testcases.py", line 777, in _pre_setup
    super(TransactionTestCase, self)._pre_setup()
  File "/usr/local/lib/python3.4/site-packages/django_fake_model/case_extension.py", line 15, in _pre_setup
    self._map_models('create_table')
  File "/usr/local/lib/python3.4/site-packages/django_fake_model/case_extension.py", line 28, in _map_models
    getattr(model, method_name)()
  File "/usr/local/lib/python3.4/site-packages/django_fake_model/models.py", line 32, in create_table
    schema_editor.create_model(cls)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 91, in __exit__
    self.execute(sql)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 111, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 124, in execute
    return self.cursor.execute(query, args)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 220, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorvalue
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 209, in execute
    r = self._query(query)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 371, in _query
    rowcount = self._do_query(q)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 335, in _do_query
    db.query(q)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/connections.py", line 280, in query
    _mysql.connection.query(self, query)
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')

Subsequent tests fails with

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/django/test/testcases.py", line 182, in __call__
    self._pre_setup()
  File "/usr/local/lib/python3.4/site-packages/django/test/testcases.py", line 777, in _pre_setup
    super(TransactionTestCase, self)._pre_setup()
  File "/usr/local/lib/python3.4/site-packages/django_fake_model/case_extension.py", line 15, in _pre_setup
    self._map_models('create_table')
  File "/usr/local/lib/python3.4/site-packages/django_fake_model/case_extension.py", line 28, in _map_models
    getattr(model, method_name)()
  File "/usr/local/lib/python3.4/site-packages/django_fake_model/models.py", line 32, in create_table
    schema_editor.create_model(cls)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 286, in create_model
    self.execute(sql, params or None)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/schema.py", line 111, in execute
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.4/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
  File "/usr/local/lib/python3.4/site-packages/django/db/backends/mysql/base.py", line 124, in execute
    return self.cursor.execute(query, args)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 220, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorvalue
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 209, in execute
    r = self._query(query)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 371, in _query
    rowcount = self._do_query(q)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/cursors.py", line 335, in _do_query
    db.query(q)
  File "/usr/local/lib/python3.4/site-packages/MySQLdb/connections.py", line 280, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (1050, "Table 'django_fake_models_bar' already exists")

I am sorry, but so far I have spent to many payed hours to work on this, and am afraid I need to move on and use real models for my tests. Best of luck with the project:-)