2015-08-11 20 views

Odpowiedz

40

Powtórzenie migracji przed ponownym uruchomieniem.

./manage.py migrate --fake yourapp 0010_my_previous_data_migration 

Następnie ponownie uruchom migrację.

./manage.py migrate your app 0011_my_data_migration 

Następnie można powrócić do ostatniej przeprowadzonej migracji. W twoim przypadku powiedziałeś, że 0011 było najnowszym, więc możesz pominąć ten etap.

./manage.py migrate --fake yourapp 0014_my_latest_data_migration 

Należy pamiętać, że w zależności od stanu bazy danych i zawartości migracji ponowne uruchomienie takiej migracji może spowodować błędy. Uwaga ostrzeżenie in the docs o opcji --fake:

ten jest przeznaczony dla zaawansowanych użytkowników, aby manipulować aktualny stan migracji bezpośrednio, jeśli są one ręcznie stosowania zmian; należy pamiętać, że użycie --fake powoduje ryzyko umieszczenia tabeli stanu migracji w stanie, w którym będzie wymagane ręczne odtworzenie, aby migracja przebiegła poprawnie.

4

Odpowiedź Alasdaira daje zrzeczenie się na ten temat, ale udawanie migracji z powrotem do poprzedniej jest bezpieczne tylko wtedy, gdy migracja jest idempotentna, co oznacza, że ​​można uruchomić ją wiele razy bez skutków ubocznych, takich jak duplikaty danych. Większość ludzi nie pisze w ten sposób swoich migracji, ale to dobra praktyka.

Masz dwie możliwości, aby ten bezpieczny proces:

  1. Nakręć migracje danych idempotent. Oznacza to, że wszystkie utworzone dane są ponownie wykorzystywane (np. Metodą Model.objects.get_or_create()) lub usunięte i ponownie utworzone. Ponownie używana jest lepsza opcja, ponieważ usuwanie i odtwarzanie zmienia indeksy i sekwencje bazy danych.
  2. Wykonuj odwrotne migracje danych. Możesz to zrobić, przekazując 2 funkcje do migrations.RunPython(). Na przykład, jeśli masz migrations.RunPython(add_countries), możesz zmienić to na migrations.RunPython(add_countries, remove_countries) i usunąć wszystkie odpowiednie kraje w drugiej funkcji.

Jeśli wybierzesz opcję nr 2 wtedy można uruchomić:

./manage.py migrate yourapp 0010_my_previous_data_migration 
./manage.py migrate yourapp 0011_my_data_migration 

Jeśli chciałeś zrobić, że jedna wkładka, dzięki czemu można używać go w kółko:

./manage.py migrate --fake yourapp 0010_my_previous_data_migration && ./manage.py migrate yourapp 0011_my_data_migration 
Powiązane problemy