Django squashmigrations: Как откатить последствия команды squashmigrations?
Я сплющил миграции и создал новые файлы миграции, сплющив все миграции приложения. Из-за некоторой проблемы после сквашмиграции я хочу отменить эффект команды сквашмиграции.
Проблема в том, что теперь команда migrate не работает, потому что Django не в состоянии обнаружить наличие старого файла миграций, который разбит на новый файл миграций.
Пример: Допустим, все четыре миграции с 0001 по 0004 применены, и затем я раздавлю их, выполнив следующую команду.
$ ./manage.py squashmigrations myapp 0004
Will squash the following migrations:
- 0001_initial
- 0002_some_change
- 0003_another_change
- 0004_undo_something
Do you wish to proceed? [yN] y
Optimizing...
Optimized from 12 operations to 7 operations.
Created new squashed migration /home/andrew/Programs/DjangoTest/test/migrations/0001_squashed_0004_undo_something.py
You should commit this migration but leave the old ones in place;
the new migration will be used for new installs. Once you are sure
all instances of the codebase have applied the migrations you squashed,
you can delete them.
Теперь, если я попытаюсь выполнить следующую команду для отката к предыдущему состоянию:
python manage.py migrate myapp 0004_undo_something
Выдается ошибка, говорящая
CommandError: Cannot find a migration matching'myapp/migrations/0004_undo_something.py' from app 'myapp'
Вам придется вернуться к ветке, в которой вы не удалили миграции, только тогда вы сможете получить доступ к последней сборке миграции.
Следовательно, подсказка Django:
You should commit this migration but leave the old ones in place;
Когда вы убедитесь, что старые миграции вам не нужны, только тогда удалите их.
the new migration will be used for new installs. Once you are sure
all instances of the codebase have applied the migrations you squashed,
you can delete them