Как справиться с проблемой `Миграция применяется раньше, чем ее зависимость`.
Мне было поручено работать над проектом, включающим react UI и django backend. Есть две версии этого приложения:
- старая версия, которая работает на старых версиях react и python (v2)
- более новая версия, которая работает на более новых версиях react и python (v3)
Передо мной была поставлена задача перенести некоторую функциональность из старой версии в новую и протестировать ее с помощью дампа базы данных postgres из живой среды, в которой работает старая версия. Сложность может заключаться в различиях в схемах баз данных новой и старой версий. (Но, скорее всего, различия будут незначительными.)
Итак, я взял дамп базы данных, прикрепил его к базе данных, запущенной на моем ноутбуке, и указал его имя в файле settings.ini моего django. Но когда я запустил свое приложение django, оно выдало мне ошибку
У вас есть 7 непримененных миграций. Ваш проект может работать неправильно, пока вы не примените миграции для приложений: admin, auth, lab, otherlabs. Запустите 'python manage.py migrate', чтобы применить их.
Когда я запустил python manage.py migrate
, он выдал мне ошибку:
Миграция
abc.0001_initial
применяется перед зависимостьюauth.0011_xyz
от базы данных 'default'.
Итак, я удалил запись, соответствующую abc.0001_initial
из таблицы django_migrations
и повторно выполнил python manage.py migrate
. Теперь я получил ту же ошибку при миграции другого проекта def
, но с той же зависимостью auth.0011_xyz
:
Миграция
def.0001_initial
применяется перед зависимостьюauth.0011_xyz
от базы данных 'default'.
Должен ли я также удалить запись, соответствующую def.0001_initial
? Боюсь, что это будет продолжаться до тех пор, пока я не удалю все такие 0001_initial
-суффиксные записи. Существует 35 проектов и, следовательно, 35 таких 0001_initial
-суффиксных записей.
Q1. Безопасно ли удалять их все и запускать миграции?
Q2. Являются ли миграции полностью безопасными для "повторного" запуска? Я имею в виду, если одна из миграций не удалась, потому что соответствующая таблица / столбцы уже есть или по каким-то другим причинам, оставит ли она базу данных в согласованном состоянии или испортит базу данных?
Q3. Также продолжит ли он выполнять остальные миграции после того, как одна из них завершится неудачей? ИЛИ
Q4. Можно ли/нужно ли выполнять остальные миграции, если одна не удалась? Если да, то нужно ли передавать какие-то аргументы программе или ее поведение по умолчанию?
Вам нужно удалить строку миграции из django_migrations для миграции def.0001_initial
, затем применить migrate auth 0011_xyz
, чтобы исправить зависимость, а затем вы можете сделать migrate def 0001_initial --fake
, чтобы подделать миграцию и добавить строку, которую вы удалили в django_migrations.