#25442: RunSQL migration is run twice (and once for real with "--fake")
----------------------------+--------------------
     Reporter:  tino        |      Owner:  nobody
         Type:  Bug         |     Status:  new
    Component:  Migrations  |    Version:  1.8
     Severity:  Normal      |   Keywords:
 Triage Stage:  Unreviewed  |  Has patch:  0
Easy pickings:  0           |      UI/UX:  0
----------------------------+--------------------
 I added a cleanup migration to remove the auth_* tables after swapping the
 user model as follows:

 {{{
 class Migration(migrations.Migration):

     dependencies = [
         ('users', '0001_initial'),
     ]

     operations = [
         migrations.RunSQL(
             "DROP TABLE auth_user_user_permissions;"
             "DROP TABLE auth_group_permissions;"
             "DROP TABLE auth_user_groups;"
             "DROP TABLE auth_group;"
             "DROP TABLE auth_permission;"
             "DROP TABLE auth_user;"
         )
     ]
 }}}

 With `python manage.py migrate`, the tables are deleted, but this
 migration is run twice, resulting in an error:

 {{{
 Applying users.0002_delete_auth_tables... OK
 Traceback (most recent call last):
   File "manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 338, in
 execute_from_command_line
     utility.execute()
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 330, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/base.py", line 393, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/base.py", line 444, in execute
     output = self.handle(*args, **options)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/commands/migrate.py", line 226, in handle
     emit_post_migrate_signal(created_models, self.verbosity,
 self.interactive, connection.alias)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/sql.py", line 280, in
 emit_post_migrate_signal
     using=db)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/dispatch/dispatcher.py", line 201, in send
     response = receiver(signal=self, sender=sender, **named)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/contrib/auth/management/__init__.py", line 93, in
 create_permissions
     "content_type", "codename"
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/query.py", line 162, in __iter__
     self._fetch_all()
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/query.py", line 965, in _fetch_all
     self._result_cache = list(self.iterator())
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/query.py", line 1220, in iterator
     for row in compiler.results_iter():
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/sql/compiler.py", line 794, in results_iter
     results = self.execute_sql(MULTI)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/sql/compiler.py", line 840, in execute_sql
     cursor.execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 79, in execute
     return super(CursorDebugWrapper, self).execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/utils.py", line 97, in __exit__
     six.reraise(dj_exc_type, dj_exc_value, traceback)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/sqlite3/base.py", line 318, in execute
     return Database.Cursor.execute(self, query, params)
 django.db.utils.OperationalError: no such table: auth_permission
 }}}

 Appearently, this also happens when the `--fake` flag is passed (I removed
 the `django_migrations` table row that marked this migration as applied),
 which is concerning because I would expect the migration not to run at
 all:

 {{{
 $ python manage.py migrate users 0002 --fake
 Operations to perform:
   Target specific migration: 0002_delete_auth_tables, from users
 Running migrations:
   Rendering model states... DONE
   Applying users.0002_delete_auth_tables... FAKED
 Traceback (most recent call last):
   File "manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 338, in
 execute_from_command_line
     utility.execute()
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 330, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/base.py", line 393, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/base.py", line 444, in execute
     output = self.handle(*args, **options)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/commands/migrate.py", line 226, in handle
     emit_post_migrate_signal(created_models, self.verbosity,
 self.interactive, connection.alias)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/core/management/sql.py", line 280, in
 emit_post_migrate_signal
     using=db)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/dispatch/dispatcher.py", line 201, in send
     response = receiver(signal=self, sender=sender, **named)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/contrib/auth/management/__init__.py", line 93, in
 create_permissions
     "content_type", "codename"
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/query.py", line 162, in __iter__
     self._fetch_all()
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/query.py", line 965, in _fetch_all
     self._result_cache = list(self.iterator())
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/query.py", line 1220, in iterator
     for row in compiler.results_iter():
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/sql/compiler.py", line 794, in results_iter
     results = self.execute_sql(MULTI)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/models/sql/compiler.py", line 840, in execute_sql
     cursor.execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 79, in execute
     return super(CursorDebugWrapper, self).execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/utils.py", line 97, in __exit__
     six.reraise(dj_exc_type, dj_exc_value, traceback)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
   File "/Users/tino/Dev/.virtualenvs/test/lib/python2.7/site-
 packages/django/db/backends/sqlite3/base.py", line 318, in execute
     return Database.Cursor.execute(self, query, params)
 django.db.utils.OperationalError: no such table: auth_permission
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/25442>
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/047.e5e411ee58324e2971cefa1a7fc1829d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to