#28789: Django won't update sqlite_master table using migrations.AlterModelTable, which causes loaddata to fail. -------------------------------------+------------------------------------- Reporter: Rafael Pires | Owner: nobody Type: Bug | Status: new Component: Database layer | Version: 1.11 (models, ORM) | Severity: Normal | Resolution: Keywords: migrations, sqlite3 | Triage Stage: | Unreviewed Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- Description changed by Rafael Pires:
Old description: > 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. > > Database: SQLite3 > Django version: 1.11.5 New description: 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 -- -- Ticket URL: <https://code.djangoproject.com/ticket/28789#comment:1> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/065.f8a7e18ad7b3fe74fa6ace509ac65980%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.