Opened 6 years ago

Closed 6 years ago

Last modified 5 years ago

#28789 closed Bug (duplicate)

Django won't update sqlite_master table using migrations.AlterModelTable, which causes loaddata to fail.

Reported by: Rafael Pires Owned by: nobody
Component: Migrations Version: 1.11
Severity: Normal Keywords: migrations, sqlite3
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Rafael Pires)

I created a migration to rename a model table:

class Migration(migrations.Migration):

    dependencies = [
        ('assessment', '0105_previous_migration'),
    ]

    operations = [
        migrations.AlterModelTable(name='MyModel', table='myapp_newmymodel')
    ]

I can run this migration just fine, the table gets renamed and the project runs fine when I access it through my browser (with SQLite3 and MySQL).

The problem is that: then I run "./manage.py test" the test fails to load the fixtures in the SQLite3 database:

./manage.py test assessment.tests.test_models
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
E
======================================================================
ERROR: setUpClass (assessment.tests.test_models.ModelsTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/test/testcases.py", line 1036, in setUpClass
    'database': db_name,
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 131, in call_command
    return command.execute(*args, **defaults)
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 69, in handle
    self.loaddata(fixture_labels)
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 115, in loaddata
    connection.check_constraints(table_names=table_names)
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 286, in check_constraints
    column_name, referenced_column_name,
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 63, in execute
    return self.cursor.execute(sql)
  File "/home/user/virtualenv/myproject/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 326, in execute
    return Database.Cursor.execute(self, query)
OperationalError: Problem installing fixtures: no such table: myapp_mymodel

*This table id is used by other tables as Foreign Key.*

I looked into the code and it seems that the migrations.AlterModelTable is not updating the sqlite_master table, so other tables that references my new table with a Foreign Key are still pointing to myapp_mymodel instead of myapp_newmymodel. This happens during check_constraints execution, the sqlite3 backend gets the key columns using get_key_columns function, that reads the "CREATE TABLE" query in sqlite_master, but since the sqlite_master table wasn't updated correctly, the process fails.

Just to be sure I ran "ALTER TABLE myapp_mymodel RENAME TO myapp_newmymodel" directly on the database and the sqlite_master table is updated correctly.

I also ran cursor.execute("ALTER TABLE myapp_mymodel RENAME TO myapp_newmymodel") instead of migrations.AlterModelTable in the migration, but the problem is the same: sqlite3 backend won't update sqlite_master references.

Database: SQLite3
Django version: 1.11.5

Change History (5)

comment:1 by Rafael Pires, 6 years ago

Description: modified (diff)

comment:2 by Tim Graham, 6 years ago

Component: Database layer (models, ORM)Migrations

I don't see an obvious place where Django is at fault. Can you provide a sample project that reproduces this problem?

comment:3 by Tim Graham, 6 years ago

Resolution: needsinfo
Status: newclosed

comment:4 by Tim Graham, 6 years ago

Resolution: needsinfoduplicate

I think this is a duplicate of #28849.

comment:5 by Marco Glauser, 5 years ago

We ran into the same problem with django 1.11. The fix hasn't been backported to 1.11 and I don't think it will be backported any time soon.
After some trial and error, we found a workaround:

We copy the original Foreignkey definition and append it to the migration that contains the AlterModelTable as a AlterField. This will update the Foreignkey in SQLite.

Note: See TracTickets for help on using tickets.
Back to Top