Ich habe einige Migrationen mit South (0.7) und Django (1.1.2) gesammelt, die in meinen Unit-Tests ziemlich viel Zeit in Anspruch nehmen. Ich möchte die Basislinie zurücksetzen und eine neue Reihe von Migrationen starten. Ich habe die South-Dokumentation überprüft , die übliche Google / Stackoverflow-Suche durchgeführt (z. B. "Migrationsverlauf für Django South (Zurücksetzen ODER Löschen ODER Entfernen)") und nichts Offensichtliches gefunden.
Ein Ansatz, den ich in Betracht gezogen habe, besteht darin, "von vorne zu beginnen", indem "South" entfernt oder der Verlauf manuell "gelöscht" wird (z. B. die DB-Tabelle löschen, Migrationsdateien aus dem Migrationsdirektor entfernen) und einfach erneut ausgeführt werden.
./manage.py Schema Migration Southtut --initial
Wenn jemand dies schon einmal getan hat und einige Tipps / Vorschläge hat, wäre er sehr dankbar.
quelle
__init__.py
zuappname/migrations
./manage.py makemigrations
aber schlimme Dinge werden passieren, wenn Sie nicht von einer neuensquashmigrations
ist die richtige AntwortAntworten:
Zunächst eine Antwort des Südautors :
Folgendes mache ich auf meinem dev + -Produktionsserver, wenn ich all diese nicht benötigten dev-Migrationen entfernen muss:
* außer wenn Sie unter anderem nur eine App bereinigen möchten, müssen Sie in diesem Fall Ihre south_history-Tabelle bearbeiten und nur die Einträge zu Ihrer App löschen.
quelle
manage.py schemamigration app name --initial
löschen, anstelle von convert_to_south benötigen .south.models.MigrationHistory.objects.all().delete()
.manage.py reset south
sind gefährlich und können die Datenbank zerstören, wenn im Projekt Apps von Drittanbietern verwendet werden, die South verwenden, wie von @thnee unten ausgeführt. Da Ihre Antwort so viele positive Stimmen hat, würde ich es sehr begrüßen, wenn Sie sie bearbeiten und zumindest eine Warnung dazu hinzufügen oder (noch besser) ändern könnten, um den @ hobs-Ansatz widerzuspiegeln (was genauso praktisch ist, aber nicht andere Apps beeinflussen) - danke!Wenn Sie Migrationen, die zu lange dauern, selektiv (nur für eine App) zurücksetzen müssen, hat dies bei mir funktioniert.
Vergessen Sie nicht, Abhängigkeiten von anderen Apps manuell wiederherzustellen, indem Sie Zeilen wie
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
Ihre<app-dir>/migrations/0001_initial.py
Datei als erstes Attribut in Ihrer Migrationsklasse hinzufügenclass Migration(SchemaMigration):
.Sie können dann
./manage.py migrate <app-name> --fake --delete-ghost-migrations
in anderen Umgebungen gemäß dieser SO-Antwort . Natürlich , wenn Sie fälschen die Lösch- oder fälschen diemigrate zero
Sie manuell benötigen, um wie alle übrig gebliebenen db Tabellen mit Migrations löschen diese .Eine nuklearere Option ist die Verwendung
./manage.py migrate --fake --delete-ghost-migrations
auf dem Live-Bereitstellungsserver, gefolgt von einem [my] sqldump. Leiten Sie dann diesen Speicherauszug in [my] sql in den Umgebungen weiter, in denen Sie die migrierte, vollständig ausgefüllte Datenbank benötigen. Südsakrileg, ich weiß, aber für mich gearbeitet.quelle
DependsOnUnknownMigration
Weile die neue anfängliche Migration vorgetäuscht. Dank Ihres Kommentars konnte ich herausfinden, dass ich diedepends_on
Aussage überall dort aktualisieren sollte , wo sie sich auf diese App bezieht. Dies ist wirklich die beste Antwort hier. Vielen Dank! :)Dank der Antworten von Dominique Guardiola und Kochfeldern konnte ich ein schwieriges Problem lösen. Es gibt jedoch einige Probleme mit der Lösung. Hier ist meine Meinung dazu.
Die Verwendung
manage.py reset south
ist keine gute Idee, wenn Sie Apps von Drittanbietern haben , die beispielsweise South verwendendjango-cms
(im Grunde verwendet alles South).reset south
löscht den gesamten Migrationsverlauf für alle von Ihnen installierten Apps.Bedenken Sie nun, dass Sie auf die neueste Version von aktualisieren
django-cms
, es wird neue Migrationen wie enthalten0009_do_something.py
. Süd wird sicherlich verwirrt werden , wenn Sie versuchen , dass die Migration zu laufen , ohne dass0001
durch0008
die Migrationsgeschichte.Es ist viel besser / sicherer, nur die Apps, die Sie warten , selektiv zurückzusetzen .
Stellen Sie zunächst sicher, dass Ihre Apps zwischen Migrationen auf der Festplatte und Migrationen, die in der Datenbank ausgeführt wurden, keine Desynchronisierung aufweisen. Andernfalls treten Kopfschmerzen auf.
1. Löschen Sie den Migrationsverlauf für meine Apps
2. Löschen Sie Migrationen für meine Apps
3. Erstellen Sie neue erste Migrationen für meine Apps
4. Führen Sie die ersten Migrationen für meine Apps fälschlicherweise aus
Dadurch werden die Migrationen eingefügt,
south_migrationhistory
ohne die tatsächlichen Tabellen zu berühren:Schritt 3 und 4 sind eigentlich nur eine längere Variante von
manage.py convert_to_south my_app
, aber ich bevorzuge diese zusätzliche Kontrolle in solch heiklen Situationen wie dem Ändern der Produktionsdatenbank.quelle
./manage.py migrate --fake
wenn Sie keine Migration anderer Apps fälschen möchten, für die Migrationen ausstehen.Wie bei Thnee (siehe ihre Antwort) verwenden wir einen sanfteren Ansatz für den hier zitierten Vorschlag des Südautors (Andrew Godwin) und trennen während der Bereitstellung, was wir mit der Codebasis tun, von dem, was wir mit der Datenbank tun , weil die Bereitstellungen wiederholbar sein müssen:
Was wir im Code tun:
Was machen wir mit der Datenbank, sobald dieser Code bereitgestellt ist?
quelle
Wenn Sie nur an der Entwicklungsmaschine arbeiten, habe ich einen Verwaltungsbefehl geschrieben, der ziemlich genau das tut, was Dominique vorgeschlagen hat.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
Im Gegensatz zum Vorschlag des südlichen Autors wird dies andere installierte Apps, die den Süden verwenden, NICHT SCHÄDIGEN.
quelle
Das Folgende ist nur, wenn Sie alle Apps zurücksetzen möchten. Bitte sichern Sie alle Datenbanken vor dieser Arbeit. Notieren Sie auch Ihre abhängigen_on in den Anfangsdateien, falls vorhanden.
Einmal:
Testen Sie das Bootstrapping Ihres Projekts vor dem Push. Wenden Sie dann für jeden lokalen / Remote-Computer Folgendes an:
Führen Sie für jede App, die Sie erneut einbeziehen möchten, die Initiale (3) aus . Beachten Sie, dass durch Zurücksetzen (6) nur der Migrationsverlauf gelöscht wird, was für Bibliotheken nicht schädlich ist. Durch gefälschte Migrationen (7) wird der Migrationsverlauf aller installierten Apps von Drittanbietern wiederhergestellt.
quelle
Löschen Sie die erforderliche Datei aus dem App-Ordner
Instanzpfad
Wiki -ist meine App
quelle