Opened 7 years ago

Closed 7 years ago

#25577 closed Bug (duplicate)

Squashed migrations do not work if deletion of indexed field can't be optimized on postgresql database

Reported by: Jacek Bzdak Owned by: nobody
Component: Migrations Version: 1.8
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

I have following model:

class AModel(models.Model):
  indexed_field = models.CharField(max_length=200, db_index=True)

And three migrations:

  1. First one creates this model
  2. Second one runs a custom sql (this SQL is empty in my example, but it could for example copy contents of indexed_field column to another column)
  3. Third one deletes indexed field from the model

If I run these three migrations separately they work.

If I squash these migrations into one they stop working with following error:

  File "/home/jb/programs/django-migrations-issue/venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: column "indexed_field" does not exist

My guess is this error is because:

Index creation executed as a deferred_sql statement, which is executed at the end of migration. At the end of my squashed migration there is no indexed_field column on the table, and postgresql raises error.

It works when migrations are separate because index creation is executed at the end of migration. It works on squashed migrations without RunSQL migration in between because field creation is entirely optimized.

I have attached example project, if you try to migrate it, it will explode. If you remove squashed migration it will work.

Attachments (1)

django-migrations-issue.tar.gz (9.3 KB) - added by Jacek Bzdak 7 years ago.

Download all attachments as: .zip

Change History (4)

Changed 7 years ago by Jacek Bzdak

comment:1 Changed 7 years ago by Tim Graham

From a quick look, I think the underlying cause might be a duplicate of #25530. Can you confirm?

comment:2 Changed 7 years ago by Jacek Bzdak

I think that this could be the problem, but I'm not very well versed in django internals to be 100% sure. If you go for proposed solution (https://code.djangoproject.com/ticket/25530#comment:6) it will also solve my problem.

Last edited 7 years ago by Jacek Bzdak (previous) (diff)

comment:3 Changed 7 years ago by Tim Graham

Resolution: duplicate
Status: newclosed
Note: See TracTickets for help on using tickets.
Back to Top