Зворотна міграція з Джанго Південь


217

Гаразд, так це здається справді дурною справою, і я впевнений, що десь щось пропускаю.

Як ви виконуєте зворотну міграцію за допомогою Півдня на Джанго?

Тому я підробив свої моделі, створив міграцію schemamigration, запустив міграцію migrate, і тепер я зрозумів, що це не зовсім те, що я хотів, і я хочу його повернути так, як раніше.

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

Хтось може допомогти?


Гарне питання!!
Маршалл X

Відповіді:


335

Вам потрібно з'ясувати кількість міграції безпосередньо перед тією, яку ви хочете відкотити.

У вашому додатку має бути каталог міграцій, у якому файли мають назву типу

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

Зазвичай, коли ви біжите ./manage.py migrate your_app, Південь виконує всі нові міграції в порядку. (Він переглядає таблиці баз даних, щоб визначити, які з них є "новими").

Однак ви також можете вказати будь-яку міграцію за номером, і Південь перемістить вашу базу даних вперед або назад , щоб перенести її до цієї точки. Отже, з наведеними вище прикладами файлів, якщо ви вже перемістили до 0003 і хотіли запустити 0003 в зворотному порядку (скасувавши його ефективно), ви запустили

./manage.py migrate your_app 0002

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


1
На жаль, коли ви створюєте наступну міграцію, вона не пропускає ті, що перебувають між ними, тому ви просто переміщаєте їх знову пізніше. Здається, може бути кращий спосіб.
mlissner

44
@mlissner Якщо ви дійсно хочете, після повернення бази даних перейдіть до папки міграцій даної програми (у наведеному вище прикладі your_app / migrations) та видаліть небажану міграцію
Josh Russo

1
Рівно - Південь ніколи не пропускає міграції; очікується, що файли від 0001-nnnn являють собою послідовний набір міграцій для будь-якого значення nnnn. Якщо це не так, то вам потрібно буде самостійно замовити або видалити порушників.
Ian Clelland

217

На випадок, якщо хтось (як я) задумався, як повернути назад від початкового (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 - фальшиво, і це був єдиний спосіб бігти 0001 назад. Дякую!
jmanning2k

1
Дуже важлива відповідь, я задумався, чому migrate 0000не вийшло. Щодо підробленої міграції, то, можливо, вона вам знадобиться, якщо, наприклад, потрібно лише скасувати (можливо, неправильну) початкову міграцію, але історія міграції вважає, що ця міграція ніколи не відбулася.
Томаш Гандор

3

Додайте ім’я міграції в кінці параметрів:

./manage.py migrate app-name 00xx-migration-name

2
Це добре, і я робив це раніше, але це дуже багато вводити / вставляти. Оголеного "державного" номера - в даному випадку 00xx- достатньо. Удосконалюючи та тестуючи міграцію, ви можете мати в історії обидві команди: вперед (без аргументу), назад з попереднім номером стану.
Томаш Гандор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.