Opened 7 years ago
Last modified 6 years ago
#28789 closed Bug
Django won't update sqlite_master table using migrations.AlterModelTable, which causes loaddata to fail. — at Initial Version
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
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