Migracja wsteczna z Django South

217

Ok, więc wydaje mi się, że to głupie pytanie i jestem pewien, że coś gdzieś brakuje.

Jak przeprowadzić migrację wsteczną przy użyciu South na Django?

Więc poprawiłem swoje modele, utworzyłem migrację za pomocą schemamigration, uruchomiłem migrację migratei teraz zdaję sobie sprawę, że nie do końca tego chciałem i chcę to zrobić wcześniej.

Bez ręcznej edycji tabel db i usuwania plików migracji, jak powinienem cofnąć migrację? Znajduję odniesienia do migracji wstecznych za pomocą Google za pośrednictwem Google, ale nie znalazłem jeszcze solidnego przykładu dla tego kodu.

Czy ktoś może pomóc?

Ruiwen
źródło
dobre pytanie!!
Marshall X

Odpowiedzi:

335

Musisz ustalić liczbę migracji tuż przed tą, którą chcesz wycofać.

Twoja aplikacja powinna mieć katalog migracji z plikami o nazwach „podobnie”

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

Zwykle po uruchomieniu ./manage.py migrate your_appSouth uruchamia kolejno wszystkie nowe migracje. (Sprawdza tabele bazy danych, aby zdecydować, które z nich są „nowe”).

Możesz jednak określić dowolną migrację według numeru, a South przeprowadzi migrację bazy danych do przodu lub do tyłu , aby przenieść ją do tego punktu. Tak więc, z przykładowymi plikami powyżej, jeśli migrowałeś już do 0003 i chciałeś uruchomić 0003 w odwrotnej kolejności (skutecznie go cofając), uruchomiłbyś

./manage.py migrate your_app 0002

South spojrzy na bazę danych, zda sobie sprawę, że już uruchomił 0003 i stwierdzi, że musi uruchomić odwrotną migrację dla 0003, aby wrócić do 0002.

Ian Clelland
źródło
1
Niestety, podczas tworzenia następnej migracji nie pomija się tych pośrednich, dlatego migruj przez nie ponownie później. Wydaje się, że może być lepszy sposób.
mlissner,
44
@mlissner Jeśli naprawdę chcesz, po wycofaniu bazy danych, przejdź do folderu migracji danej aplikacji (w powyższym przykładzie twoja_aplikacja / migracje) i usuń niechcianą migrację
Josh Russo
1
Dokładnie - Południe nigdy nie pomija migracji; oczekuje, że pliki z 0001-nnnn reprezentują spójny zestaw migracji dla dowolnej wartości nnnn. Jeśli tak nie jest, musisz samodzielnie zamówić lub usunąć szkodliwe.
Ian Clelland,
217

Na wypadek gdyby ktoś (jak ja) zastanawiał się, jak przeprowadzić migrację z początkowej wersji (0001) :

django-admin.py migrate some_app zero

wynik:

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

„zero” to specjalny stan przed każdą migracją.

Odniesienie: http://south.aeracode.org/docs/commands.html

Ctrl + C
źródło
6
Ktoś uruchomił migrację 0001 - fałszywy, i był to jedyny sposób, aby uruchomić 0001 wstecz. Dzięki!
jmanning2k
1
Bardzo ważna odpowiedź, zastanawiałem się, dlaczego migrate 0000nie działa. Jeśli chodzi o fałszywą migrację, tak, możesz jej potrzebować, jeśli np. Musisz tylko cofnąć (prawdopodobnie błędną) migrację początkową, ale historia migracji uważa, że ​​migracja ta nigdy nie miała miejsca.
Tomasz Gandor
3

Dodaj nazwę migracji na końcu parametrów:

./manage.py migrate app-name 00xx-migration-name
Jerzyk
źródło
2
Jest OK i robiłem to wcześniej, ale dużo pisania i wklejania. Wystarczy „pusty” numer - w tym przypadku 00xx-. Podczas ulepszania i testowania migracji możesz mieć obie komendy w historii: do przodu (bez argumentu), do tyłu z poprzednim numerem stanu.
Tomasz Gandor