Opened 8 years ago

Last modified 8 years ago

#25945 closed Bug

Makemigrations referring to squashed migrations — at Version 3

Reported by: Jarek Glowacki Owned by: nobody
Component: Migrations Version: dev
Severity: Normal Keywords: make squash migrations partially run dependencies
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Jarek Glowacki)

Consider the migration tree defined by:

my_app/migrations/
0001_initial.py
0002_blah.py -> dep on 0001_initial
0001_initial_squashed_0002_blah.py -> replaces 0001_initial and 0002_blah
0003_ohnoes.py -> dep on ????

If we try to make 0003 depend on 0001_initial_squashed_0002_blah, then we get a NodeNotFoundError if the database is only up to 0001_initial: it is currently in the 'unsquashed reality' in which 0001_initial_squashed_0002_blah does not exist. Creating new databases from this setup does not raise any problems, nor does running the migrations on databases that aren't part-way through a squashed migration series since these will live in the 'squashed reality'.

If we try to make 0003 depend on 0002_blah, then things work fine in all cases.

However makemigrations chooses to point newly created migrations at the squashed migration 0001_initial_squashed_0002_blah rather than the last of the unsquashed ones 0002_blah, causing the problem described above and making it unobvious that new migrations should still point at the old replaced migrations up until the point at which the squashed migrations get transitioned to normal migrations.

Proposed solution:

Fully support listing the dependency both ways, as 0001_initial_squashed_0002_blah and as 0002_blah. For cases where the migration tree is in the unsquashed reality and thus does not contain 0001_initial_squashed_0002_blah, have it inspect the 'replaces' list in 0001_initial_squashed_0002_blah.py, pick out the most recent migration (ie 0002_blah) and use that instead.

Another (perhaps cleaner, yet less clear) solution:

Have makemigrations not point newly created migrations at squashed migrations, but rather at the squashed migrations' last dependency. This would solve the issue with makemigrations automatically creating problematic migrations. It would be cleaner as there'd only be one correct migration to point to, however it could result in confusion for people manually creating their migrations and pointing them at the wrong thing.

Change History (3)

comment:1 by Jarek Glowacki, 8 years ago

Summary: Unabled to refer to partially-run squashed migrations in newer migrations.Unable to refer to partially-run squashed migrations in newer migrations.

comment:2 by Tim Graham, 8 years ago

Triage Stage: UnreviewedAccepted

comment:3 by Jarek Glowacki, 8 years ago

Description: modified (diff)
Keywords: make squash migrations added; squashmigrations removed
Summary: Unable to refer to partially-run squashed migrations in newer migrations.Makemigrations referring to squashed migrations
Note: See TracTickets for help on using tickets.
Back to Top