Обратная миграция с Джанго Югом

199

Хорошо, так что это кажется действительно глупым вопросом, и я уверен, что где-то там что-то не хватает.

Как вы выполняете обратную миграцию с помощью юга на Django?

Итак, я изменил свои модели, создал миграцию с помощью schemamigration, запустил миграцию с помощью migrate, и теперь я понимаю, что не совсем то, что я хотел, и я хочу, чтобы это было раньше.

Не удалось вручную отредактировать таблицы db и удалить файлы миграции, как мне перейти к переносу миграции? Я нахожу ссылки на обратные миграции с помощью юга через Google, но пока не нашел для него прочного кода.

Может ли кто-нибудь помочь?

  • 0
    хороший вопрос!!
Теги:
migration
django-south

3 ответа

312
Лучший ответ

Вам нужно выяснить количество миграции перед тем, который вы хотите отменить.

В вашем приложении должен быть каталог миграции, с файлами в нем с именем

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py

Обычно, когда вы запускаете ./manage.py migrate your_app, Юг запускает все новые миграции в порядке. (Он рассматривает таблицы базы данных, чтобы определить, какие из них являются "новыми" ).

Однако вы также можете указать любую миграцию по номеру, а South будет перенаправлять вашу базу данных, как вперед, так и назад, чтобы перейти к этой точке. Итак, с приведенными выше примерами файлов, если вы уже перенесли до 0003, и вы хотите запустить 0003 в обратном порядке (эффективно отменив его), вы запустите

./manage.py migrate your_app 0002

Юг будет смотреть на базу данных, понять, что она уже запущена 0003 и определить, что ей нужно запустить обратную миграцию для 0003, чтобы вернуться к 0002.

  • 1
    К сожалению, когда вы создаете следующую миграцию, она не пропускает промежуточные, поэтому вы просто мигрируете через них позже. Похоже, что может быть лучше.
  • 44
    @mlissner Если вы действительно хотите, после отката базы данных, перейдите в папку миграций данного приложения (в приведенном выше примере your_app / migrations) и удалите нежелательную миграцию.
Показать ещё 1 комментарий
227

На всякий случай кто-то (как и я) задавался вопросом, как выполнить миграцию из начального (0001):

django-admin.py migrate some_app zero

выход:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial

"ноль" - это особое состояние перед любой миграцией.

Ссылка: http://south.aeracode.org/docs/commands.html

  • 6
    Кто-то запустил миграцию 0001 - fake, и это был единственный способ запустить 0001 в обратном направлении. Спасибо!
  • 1
    Очень важный ответ, я задавался вопросом, почему migrate 0000 не работает. Что касается фальшивой миграции, да, она может вам понадобиться, если вам, например, нужно только отменить (возможно, неправильную) начальную миграцию, но история миграции считает, что эта миграция никогда не происходила.
3

Добавить имя миграции в конце параметров:

./manage.py migrate app-name 00xx-migration-name
  • 2
    Это нормально, и я делал это раньше, но это много печатать / вставлять. Голого «государственного» числа - в данном случае 00xx - достаточно. При улучшении и тестировании миграции вы можете иметь обе команды в истории: вперед (без аргументов), назад с предыдущим номером состояния.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню