#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.

Reply via email to