Как откатить нелинейные миграции в django?
Предположим, у меня есть следующие миграции в Django.
X
/ \
A B [A and B can represent any number of linear migrations.]
\ /
Y (merge migration).
Как я могу откатить только B и Y? А A оставить как есть.
X(*) [* represent migration has been applied.]
/ \
A(*) B(*) [A and B can represent any number of linear migrations.]
\ /
Y(*) (merge migration)
Шаги для неприменения только одного пути, т.е. B и Y
Применяйте только Y. Выполняя
python manage.py migrate app B (or A; both works)
.X(*) / \ A(*) B(*) \ / Y()
Удалите на время файлы миграции A и Y из местоположения проекта.
X(*) \ B(*)
Теперь отмените применение B, выполнив
python manage.py migrate app X
.X(*) \ B()
Верните файлы миграции A и Y в исходное место. Теперь вы можете спокойно удалить непримененные миграции B и Y, если хотите.
X(*) / \ A(*) B() \ / Y()
Суть в том, что django может откатить миграции, только если файлы присутствуют в локации. Если вы не хотите откатывать путь миграции (т.е. A здесь), удалите его из расположения проекта при выполнении отката.