Повторный запуск миграции данных Django
Как бы я перезапустил миграцию данных на Django 1.8+? Если необходимо, моя миграция пронумерована 0011_my_data_migration.py и это последняя миграция.
2 ответов
фейк вернемся к миграции, прежде чем тот, который вы хотите повторить.
./manage.py migrate --fake yourapp 0010_my_previous_data_migration
затем повторите миграцию.
./manage.py migrate yourapp 0011_my_data_migration
затем вы можете подделать назад к самой последней миграции, которую вы запустили. В вашем случае вы сказали, что 0011 был последним, поэтому вы можете пропустить этот этап.
./manage.py migrate --fake yourapp 0014_my_latest_data_migration
обратите внимание, что в зависимости от состояния базы данных и содержимого миграций повторный запуск миграции может привести к ошибкам. Обратите внимание на предупреждение в docs о :
это предназначено для продвинутых пользователей, чтобы напрямую управлять текущим состоянием миграции, если они вручную применяют изменения; будьте предупреждены, что с помощью
--fake
рискует привести таблицу состояния миграции в состояние, в котором для корректного выполнения миграции потребуется ручное восстановление.
ответ Alasdair дает отказ от ответственности об этом, но подделка миграции назад к предыдущему безопасна только в том случае, если ваша миграция идемпотентна, что означает, что вы можете запускать ее несколько раз без побочных эффектов, таких как дубликаты данных. Большинство людей не пишут свои миграции таким образом, но это хорошая практика.
у вас есть два варианта, чтобы сделать этот процесс безопасным:
- Сделайте ваши миграции данных идемпотентными. Это означает, что любые созданные данные либо повторно используются (например с
Model.objects.get_or_create()
метод) или удален и воссоздан. Повторное использование является лучшим вариантом, так как удаление и воссоздание изменит индексы и последовательности базы данных. - сделайте обратные миграции данных. Вы можете сделать это, передав 2 функции в
migrations.RunPython()
. Например, если у вас естьmigrations.RunPython(add_countries)
, вы бы изменили это наmigrations.RunPython(add_countries, remove_countries)
и исключить все соответствующие страны во второй функции.
если вы выберете опцию #2, вы запустите:
./manage.py migrate yourapp 0010_my_previous_data_migration
./manage.py migrate yourapp 0011_my_data_migration
если вы хотели сделать что один вкладыш, так что вы можете использовать его снова и снова:
./manage.py migrate yourapp 0010_my_previous_data_migration && ./manage.py migrate yourapp 0011_my_data_migration