Zebrałem sporo migracji przy użyciu South (0.7) i Django (1.1.2), które zaczynają zajmować sporo czasu w moich testach jednostkowych. Chciałbym zresetować linię bazową i rozpocząć nowy zestaw migracji. Przejrzałem dokumentację South , przeprowadziłem zwykłe wyszukiwanie w Google / Stackoverflow (np. „Django south (zresetuj LUB usuń LUB usuń) historię migracji”) i nie znalazłem nic oczywistego.
Jedno podejście, które rozważałem, obejmowałoby „rozpoczęcie od nowa” poprzez „usunięcie„ południa ”lub„ wyczyszczenie ”historii ręcznie (np. Wyczyszczenie tabeli db, usunięcie plików migracji z dyrektora migracji) i po prostu ponowne uruchomienie,
./manage.py schemamigration southtut --initial
Tak więc, jeśli ktoś zrobił to wcześniej i ma jakieś wskazówki / sugestie, byłby bardzo wdzięczny.
źródło
__init__.py
doappname/migrations
./manage.py makemigrations
ale jeśli nie zaczniesz od nowejsquashmigrations
to właściwa odpowiedźOdpowiedzi:
Najpierw odpowiedź autora Południa :
Oto, co robię na moim serwerze deweloperskim + produkcyjnym, kiedy muszę pozbyć się tych wszystkich niepotrzebnych migracji deweloperów:
* z wyjątkiem sytuacji, gdy chcesz wyczyścić tylko jedną aplikację, jeśli tak, musisz edytować swoją tabelę south_history i usunąć tylko wpisy dotyczące Twojej aplikacji.
źródło
manage.py schemamigration app name --initial
zamiast convert_to_south.south.models.MigrationHistory.objects.all().delete()
.manage.py reset south
jest niebezpieczna i może zniszczyć bazę danych, jeśli w projekcie są używane aplikacje stron trzecich, jak wskazał @thnee poniżej. Ponieważ Twoja odpowiedź ma tak wiele pozytywnych głosów, bardzo bym wdzięczny, gdybyś mógł ją edytować i dodać przynajmniej ostrzeżenie o tym lub (nawet lepiej) zmienić to, aby odzwierciedlić podejście @hobs (co jest równie wygodne, ale nie wpływają na inne aplikacje) - dzięki!Jeśli musisz wybiórczo (tylko dla jednej aplikacji) zresetować migracje, które trwają zbyt długo, to zadziałało.
Nie zapomnij ręcznie przywrócić wszelkich zależności od innych aplikacji, dodając wiersze takie jak
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
do<app-dir>/migrations/0001_initial.py
pliku, jako pierwszy atrybut w klasie migracji tuż poniżejclass Migration(SchemaMigration):
.Możesz wtedy
./manage.py migrate <app-name> --fake --delete-ghost-migrations
w innych środowiskach, zgodnie z tą odpowiedzią SO . Oczywiście jeśli fałszywy Delete lub sfałszowaćmigrate zero
musisz ręcznie usuwać lewej nad stołami db z migracją, takich jak ten .Bardziej nuklearną opcją jest
./manage.py migrate --fake --delete-ghost-migrations
uruchomienie na żywo serwera wdrażania, po którym następuje [my] sqldump. Następnie potokuj zrzut do [my] sql w środowiskach, w których potrzebujesz zmigrowanej, w pełni zapełnionej bazy danych. Wiem, że południowe świętokradztwo, ale zadziałało dla mnie.źródło
DependsOnUnknownMigration
czas udawałem nową początkową migrację. Dzięki Twojemu komentarzowi mogłem się domyślić, że powinienem zaktualizowaćdepends_on
oświadczenie wszędzie tam, gdzie odnosi się do tej aplikacji. To naprawdę najlepsza odpowiedź. Dzięki! :)Dzięki odpowiedziom Dominique Guardioli i płytom pomogło mi to rozwiązać trudny problem. Jednak jest kilka problemów z rozwiązaniem, oto moje podejście.
Stosując
manage.py reset south
to nie jest dobry pomysł , jeśli masz jakiekolwiek aplikacje firm trzecich , które wykorzystuje South, na przykładdjango-cms
(w zasadzie wszystko wykorzystuje Południowa).reset south
usunie całą historię migracji dla wszystkich zainstalowanych aplikacji.Teraz weź pod uwagę, że uaktualniasz do najnowszej wersji
django-cms
, będzie ona zawierała nowe migracje, takie jak0009_do_something.py
. Południe z pewnością będzie zdezorientowane, gdy spróbujesz przeprowadzić tę migrację bez0001
przechodzenia przez0008
historię migracji.Znacznie lepiej / bezpieczniej jest selektywnie resetować tylko te aplikacje, które utrzymujesz .
Przede wszystkim upewnij się, że Twoje aplikacje nie mają desynchronizacji między migracjami na dysku a migracjami, które zostały wykonane w bazie danych. W przeciwnym razie wystąpi ból głowy.
1. Usuń historię migracji moich aplikacji
2. Usuń migracje moich aplikacji
3. Utwórz nowe początkowe migracje dla moich aplikacji
4. Fałszywe wykonanie początkowych migracji moich aplikacji
Spowoduje to wstawienie migracji do
south_migrationhistory
bez dotykania rzeczywistych tabel:Krok 3 i 4 to właściwie tylko dłuższa odmiana
manage.py convert_to_south my_app
, ale wolę tę dodatkową kontrolę w tak delikatnej sytuacji, jak modyfikacja produkcyjnej bazy danych.źródło
./manage.py migrate --fake
jeśli nie chcesz fałszywie migrować innych aplikacji, które mają oczekujące migracje.Podobnie jak thnee (zobacz jej odpowiedź), używamy łagodniejszego podejścia do sugestii autora z Południa (Andrew Godwina) cytowanej w innym miejscu tutaj i oddzielamy to, co robimy z bazą kodu, od tego, co robimy z bazą danych podczas wdrażania ponieważ potrzebujemy powtarzalności wdrożeń:
Co robimy w kodzie:
Co robimy z bazą danych po wdrożeniu tego kodu
źródło
Jeśli pracujesz tylko na maszynie deweloperskiej, napisałem polecenie zarządzania, które robi dokładnie to, co sugerował Dominique.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
W przeciwieństwie do sugestii autora z południa, NIE SZKODZI to innych zainstalowanych aplikacji korzystających z południa.
źródło
Następujące jest tylko wtedy, gdy chcesz zresetować wszystkie aplikacje. Przed przystąpieniem do tej pracy wykonaj kopię zapasową wszystkich baz danych. Zanotuj także swój depends_on w plikach początkowych, jeśli takie istnieją.
Raz:
Przetestuj ładowanie projektu przed wypchnięciem. Następnie dla każdego komputera lokalnego / zdalnego zastosuj następujące czynności:
Wykonaj wstępne (3) dla każdej aplikacji, którą chcesz ponownie zaangażować. Pamiętaj, że reset (6) usunie tylko historię migracji, dlatego nie jest szkodliwy dla bibliotek. Fałszywe migracje (7) spowodują przywrócenie historii migracji wszelkich zainstalowanych aplikacji innych firm.
źródło
usuń niezbędny plik z folderu aplikacji
ścieżka instancji
wiki - to moja aplikacja
źródło