Jakie jest zalecane podejście do resetowania historii migracji przy użyciu Django South?

Zgromadziłem sporo migracji używając South (0.7) i Django (1.1.2), które zaczynają pochłonąć sporo czasu w moich testach jednostkowych. Chciałbym zresetować linię bazową i rozpocząć nowy zestaw migracji. Przejrzałem dokumentację South , wykonałem zwykłe wyszukiwanie w Google / Stackoverflow (np. "django south (reset OR delete OR remove) migration history") i nie znalazłem niczego oczywistego.

Jedno podejście, które rozważałem, obejmowałoby "zaczynając od nowa" przez" usunięcie "lub" wyczyszczenie " historii ręcznie (np. Wyczyść tabelę db, Usuń pliki migracji z programu migrations director) i po prostu uruchom ponownie,

./manage.py schemamigration southtut --initial

Tak więc, jeśli ktoś robił to wcześniej i ma jakieś wskazówki/sugestie, będą bardzo mile widziane.

Author: skaffman, 2011-01-07

7 answers

EDIT-umieszczam komentarz poniżej na górze, ponieważ ważne jest, aby go przeczytać przed > zaakceptowaną odpowiedzią, która następuje @andybak

@Dominique: Twoja rada odnośnie manage.py reset południe jest niebezpieczne i może zniszczyć bazę danych, jeśli istnieją aplikacje innych firm używające południe w projekcie, jak wskazał @thnee poniżej. Ponieważ twój answer ma tak wiele upvotów, że naprawdę byłbym wdzięczny, gdybyś mógł edytować to i dodać przynajmniej ostrzeżenie o to, lub (jeszcze lepiej) zmienić aby odzwierciedlić podejście @ kuchenki (co jest równie wygodne, ale nie wpływ na inne aplikacje) - dzięki! - chrisv Mar 26 ' 13 at 9: 09

Zaakceptowana odpowiedź następuje poniżej:

Pierwsza, odpowiedź autora południa :

Tak długo, jak dbasz o to, aby zrobić to na wszystkich wdrożeniach jednocześnie, nie powinno być z tym żadnego problemu. Osobiście zrobiłbym:

    rm -r appname/migrations/ 
    ./manage.py reset south 
    ./manage.py convert_to_south appname 

(zauważ, że część" reset south " czyści migracja rekordów dla wszystkich aplikacji, więc upewnij się, że uruchomisz dwa pozostałe wiersze dla wszystkich aplikacji lub usuń selektywnie).

Wywołanie convert_to_south na końcu powoduje nową migrację i fake-stosuje ją (ponieważ twoja baza danych ma już odpowiednie tabele). Nie ma potrzeby upuszczania wszystkich tabel aplikacji podczas procesu.

Oto co robię na moim serwerze dev + production, kiedy muszę pozbyć się tych wszystkich niepotrzebnych migracji dev:

  1. upewnij się, że mamy ten sam schemat DB po obu stronach
  2. Usuń każdy folder migracji po obu stronach
  3. run ./manage.py zresetuj południe (jak pisze post) po obu stronach = czyści Południową tabelę *
  4. run ./manage.py convert_to_south po obu stronach (0001)
  5. następnie mogę ponownie rozpocząć migracje i wypchnąć foldery migracji na moim serwerze

* chyba, że chcesz wyczyścić tylko jedną aplikację między innymi, jeśli tak, musisz edytować south_history tabelę i usuń tylko wpisy dotyczące twojej aplikacji.

 121
Author: Dominique Guardiola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-21 10:27:49

Jeśli potrzebujesz selektywnie (tylko dla jednej aplikacji) zresetować migracje, które trwają zbyt długo, to zadziałało dla mnie.

rm <app-dir>/migrations/*
python manage.py schemamigration <app-name> --initial
python manage.py migrate <app-name> 0001 --fake  --delete-ghost-migrations

Nie zapomnij ręcznie przywrócić zależności w innych aplikacjach, dodając linie takie jak depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial")) do pliku <app-dir>/migrations/0001_initial.py, jako pierwszy atrybut w klasie migracji tuż poniżej class Migration(SchemaMigration):.

Można wtedy ./manage.py migrate <app-name> --fake --delete-ghost-migrations w innych środowiskach, na to więc odpowiedź . Oczywiście jeśli sfałszujesz delete lub sfałszujesz migrate zero, będziesz musiał ręcznie usunąć wszelkie pozostałe tabele db z migracją typu this .

Bardziej jądrową opcją jest ./manage.py migrate --fake --delete-ghost-migrations na serwerze wdrażania na żywo, a następnie [my]sqldump. Następnie przenieś ten zrzut do [my]sql w środowiskach, w których potrzebujesz zmigrowanego, w pełni wypełnionego db. South sacrilege, wiem, ale zadziałało na mnie.

 188
Author: hobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:39

Dzięki odpowiedziom Dominique ' a Guardioli i grzejników kuchennych, pomogło mi rozwiązać trudny problem. Jednak jest kilka problemów z rozwiązaniem, oto moje podejście do niego.

Używanie manage.py reset south jest nie jest dobrym pomysłem , jeśli masz aplikacje innych firm , które używają South, na przykład django-cms (W zasadzie wszystko używa South).

reset south usunie całą historię migracji dla wszystkich zainstalowanych aplikacji.

Teraz rozważ, że uaktualnisz do najnowszej wersja django-cms, będzie zawierać nowe migracje, takie jak 0009_do_something.py. Południe z pewnością będzie zdezorientowane, gdy spróbujesz przeprowadzić tę migrację bez 0001 przez 0008 w historii migracji.

O wiele lepiej / bezpieczniej jest selektywnie resetować tylko aplikacje, które utrzymujesz.

Przede wszystkim upewnij się, że Twoje aplikacje nie mają żadnej desynchronizacji między migracjami na dysku a migracjami wykonanymi w bazie danych. W przeciwnym razie będzie ból głowy.

1. Usuń historię migracji dla moich aplikacji]}
sql> delete from south_migrationhistory where app_name = 'my_app';

2. Usuń migracje Dla Moich aplikacji]}
$ rm -rf my_app/migrations/

3. Tworzenie nowych początkowych migracji dla aplikacji my apps]}
$ ./manage.py schemamigration --initial my_app

4. Fałszywe wykonywanie początkowych migracji dla moich aplikacji

Wstawia migracje do south_migrationhistory bez dotykania rzeczywistych tabel:

$ ./manage.py migrate --fake my_app

Krok 3 i 4 to właściwie tylko dłuższy wariant manage.py convert_to_south my_app, ale wolę tę dodatkową kontrolę, w tak delikatnej sytuacji, jak modyfikowanie baza danych produkcji.

 55
Author: thnee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-18 19:02:17

Podobnie jak thnee (zobacz jej odpowiedź), używamy łagodniejszego podejścia do sugestii autora południa (Andrew Godwin) cytowanej gdzie indziej tutaj i oddzielamy to, co robimy z bazą kodu od tego, co robimy z bazą danych, podczas wdrażania, ponieważ potrzebujemy, aby wdrożenia były powtarzalne: {]}

Co robimy w kodzie:

# Remove all the migrations from the app
$ rm -fR appname/migrations
# Make the first migration (don't touch the database)
$ ./manage.py schemamigration appname --initial

Co robimy z bazą danych po wdrożeniu kodu

# Fake the migration history, wiping out the rest
$ ./manage.py migrate appname --fake --delete-ghost-migrations
 7
Author: tobych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-30 00:14:53

Jeśli tylko pracujesz na maszynie dev, napisałem polecenie zarządzania, które robi prawie to, co sugerował Dominique.

Http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html

W przeciwieństwie do sugestii autora south, nie zaszkodzi to innym zainstalowanym aplikacjom używającym south.

 1
Author: idanzalz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 17:56:43

Następujące jest tylko, jeśli chcesz zresetować wszystkie aplikacje. Proszę wykonać kopię zapasową wszystkich baz danych przed wykonaniem tej pracy. Zanotuj również depends_on w plikach początkowych, jeśli istnieją.

Raz:

(1) find . -type d -name migrations -exec git rm -rf '{}' \;
(2) find . -type d -name migrations -exec rm -rf '{}' \;
(3) ./manage.py schemamigration <APP_NAME> --initial
(4) [GIT COMMIT]

Przetestuj bootstrapowanie projektu przed wypchnięciem. Następnie, dla każdej lokalnej/zdalnej maszyny, zastosuj następujące:

(5) [GIT PULL]
(6) ./manage.py reset south
(7) ./manage.py migrate --fake

Wykonaj initial (3) dla każdej aplikacji, którą chcesz ponownie włączyć. Należy pamiętać, że reset (6) usunie tylko historię migracji, dlatego nie będzie szkodliwy dla bibliotek. Fałszywe migracje (7) przywrócą historię migracji wszystkich zainstalowanych aplikacji innych firm.

 1
Author: hurturk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-05 13:04:38

Usuń niezbędny plik z folderu aplikacji

Przykładowa ścieżka

 cd /usr/local/lib/python2.7/dist-packages/wiki/south_migrations

Wiki - is my app

 0
Author: Andrei Eremchuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-17 02:19:37