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

Reply via email to