#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 [email protected].
To post to this group, send email to [email protected].
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.

Reply via email to