#28789: Django won't update sqlite_master table using migrations.AlterModelTable, which causes loaddata to fail. -------------------------------------+------------------------------------- Reporter: Rafael | Owner: nobody Pires | Type: Bug | Status: new Component: Database | Version: 1.11 layer (models, ORM) | Severity: Normal | Keywords: migrations, sqlite3 Triage Stage: | Has patch: 0 Unreviewed | Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 0 UI/UX: 0 | -------------------------------------+------------------------------------- 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 -- Ticket URL: <https://code.djangoproject.com/ticket/28789> 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/050.0bc44c70a9f9ee36583c785b49ead015%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.