#27885: Migration creates index of a deleted table
-------------------------------+--------------------------------------
     Reporter:  ihucos         |                    Owner:  nobody
         Type:  Uncategorized  |                   Status:  new
    Component:  Migrations     |                  Version:  1.8
     Severity:  Normal         |               Resolution:
     Keywords:                 |             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 ihucos:

Old description:

> If we create a model in a migration with an indexed field, then delete
> that model, migrations will still try to create the index on a
> nonexistent table.
>
> That scenario occurred after squashing migrations.
>
> Happened on Django 1.8.13
>
> Example Migration that reproduces this:
>

> {{{
> # -*- coding: utf-8 -*-
> from __future__ import unicode_literals
>
> from django.db import migrations, models
>

> class Migration(migrations.Migration):
>
>     dependencies = [
>         ('bookoya', '0085_auto_20170214_1425'),
>     ]
>
>     operations = [
>         migrations.CreateModel(
>             name='MyModel',
>             fields=[
>                 ('name', models.CharField(max_length=100, unique=True,
> serialize=False, primary_key=True, db_index=True)),
>             ],
>         ),
>
>         migrations.DeleteModel(
>             name='MyModel',
>         ),
>     ]
> }}}

New description:

 If we create a model in a migration with an indexed field, then delete
 that model, migrations will still try to create the index on a nonexistent
 table.

 That scenario occurred after squashing migrations.

 Happened on Django 1.8.13

 Example Migration that reproduces this:


 {{{
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals

 from django.db import migrations, models


 class Migration(migrations.Migration):

     dependencies = [
         ('bookoya', '0085_auto_20170214_1425'),
     ]

     operations = [
         migrations.CreateModel(
             name='MyModel',
             fields=[
                 ('name', models.CharField(max_length=100, unique=True,
 serialize=False, primary_key=True, db_index=True)),
             ],
         ),

         migrations.DeleteModel(
             name='MyModel',
         ),
     ]
 }}}





 {{{
 ~/R $ python manage.py migrate
 Waiting for database...
 (0.000) select 1; args=None
 Database ready
 (0.003) SELECT 1 FROM pg_database WHERE datname = 'template_postgis' LIMIT
 1;; args=('template_postgis',)
 (0.001) CREATE EXTENSION IF NOT EXISTS postgis; args=None
 (0.009)
             SELECT c.relname, c.relkind
             FROM pg_catalog.pg_class c
             LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
             WHERE c.relkind IN ('r', 'v')
                 AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                 AND pg_catalog.pg_table_is_visible(c.oid); args=None
 (0.005) SELECT "django_migrations"."app", "django_migrations"."name" FROM
 "django_migrations"; args=()
 Operations to perform:
   Synchronize unmigrated apps: checkrequirements, s3_folder_storage,
 tastypie_oauth, gis, postgres, cacheops, webpack_loader, staticfiles,
 debug_toolbar, djorm_core, waitfordb, messages, django_otp, django_nose,
 storages, session_cleanup,
  djorm_hstore, djorm_expressions
   Apply all migrations: oauth2_provider, qmore, admin, oauth_provider,
 sendgrid, sessions, tastypie, otp_static, flatpages, sites,
 kombu_transport_django, invoices, contenttypes, bookoya, auth, recommend,
 otp_totp, two_factor
 Synchronizing apps without migrations:
 (0.005)
             SELECT c.relname, c.relkind
             FROM pg_catalog.pg_class c
             LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
             WHERE c.relkind IN ('r', 'v')
                 AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                 AND pg_catalog.pg_table_is_visible(c.oid); args=None
   Creating tables...
     Running deferred SQL...
   Installing custom SQL...
 Running migrations:
   Rendering model states... DONE
   Applying bookoya.0086_auto_20170227_1359...CREATE TABLE
 "bookoya_mymodel" ("name" varchar(100) NOT NULL PRIMARY KEY); (params
 None)
 (0.025) CREATE TABLE "bookoya_mymodel" ("name" varchar(100) NOT NULL
 PRIMARY KEY); args=None
 DROP TABLE "bookoya_mymodel" CASCADE; (params [])
 (0.002) DROP TABLE "bookoya_mymodel" CASCADE; args=[]
 DELETE FROM geometry_columns WHERE f_table_name = 'bookoya_mymodel';
 (params [])
 (0.002) DELETE FROM geometry_columns WHERE f_table_name =
 'bookoya_mymodel'; args=[]
 CREATE INDEX "bookoya_mymodel_name_e935283cc44e389_like" ON
 "bookoya_mymodel" ("name" varchar_pattern_ops); (params [])
 (0.012) CREATE INDEX "bookoya_mymodel_name_e935283cc44e389_like" ON
 "bookoya_mymodel" ("name" varchar_pattern_ops); args=[]
 Traceback (most recent call last):
   File "manage.py", line 47, in <module>
     execute_from_command_line(sys.argv)
   File "/usr/local/lib/python2.7/dist-
 packages/django/core/management/__init__.py", line 354, in
 execute_from_command_line
     utility.execute()
   File "/usr/local/lib/python2.7/dist-
 packages/django/core/management/__init__.py", line 346, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/usr/local/lib/python2.7/dist-
 packages/django/core/management/base.py", line 394, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/usr/local/lib/python2.7/dist-
 packages/django/core/management/base.py", line 445, in execute
     output = self.handle(*args, **options)
   File "/usr/local/lib/python2.7/dist-
 packages/django/core/management/commands/migrate.py", line 222, in handle
     executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
   File "/usr/local/lib/python2.7/dist-
 packages/django/db/migrations/executor.py", line 110, in migrate
     self.apply_migration(states[migration], migration, fake=fake,
 fake_initial=fake_initial)
   File "/usr/local/lib/python2.7/dist-
 packages/django/db/migrations/executor.py", line 148, in apply_migration
     state = migration.apply(state, schema_editor)
   File "/usr/local/lib/python2.7/dist-
 packages/django/db/backends/base/schema.py", line 91, in __exit__
     self.execute(sql)
   File "/usr/local/lib/python2.7/dist-
 packages/django/db/backends/base/schema.py", line 111, in execute
     cursor.execute(sql, params)
   File "/usr/local/lib/python2.7/dist-
 packages/django/db/backends/utils.py", line 79, in execute
     return super(CursorDebugWrapper, self).execute(sql, params)
   File "/usr/local/lib/python2.7/dist-packages/cacheops/transaction.py",
 line 86, in execute
     result = self._no_monkey.execute(self, sql, params)
   File "/usr/local/lib/python2.7/dist-
 packages/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
   File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line
 98, in __exit__
     six.reraise(dj_exc_type, dj_exc_value, traceback)
   File "/usr/local/lib/python2.7/dist-
 packages/django/db/backends/utils.py", line 64, in execute
     return self.cursor.execute(sql, params)
 django.db.utils.ProgrammingError: relation "bookoya_mymodel" does not
 exist
 }}}

--

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

Reply via email to