Rückwärtswanderung mit Django South

217

Ok, das scheint eine wirklich dumme Frage zu sein, und ich bin mir sicher, dass mir irgendwo etwas fehlt.

Wie führt man eine Rückwärtsmigration mit South auf Django durch?

Also habe ich meine Modelle optimiert, eine Migration mit erstellt schemamigration, die Migration mit ausgeführt migrate, und jetzt ist mir klar, dass dies nicht ganz das ist, was ich wollte, und ich möchte es wieder so wie zuvor.

Wie sollte ich die Migration zurücksetzen, ohne DB-Tabellen manuell zu bearbeiten und Migrationsdateien zu entfernen? Ich finde Verweise auf Rückwärtsmigrationen mit South über Google, habe aber noch kein solides Codebeispiel dafür gefunden.

Kann jemand helfen?

Ruiwen
quelle
gute Frage!!
Marshall X

Antworten:

335

Sie müssen die Nummer der Migration kurz vorher herausfinden die Sie zurücksetzen möchten.

Ihre App sollte über ein Migrationsverzeichnis verfügen, in dem sich die Dateien wie folgt befinden

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

Normalerweise beim Laufen ./manage.py migrate your_app South alle neuen Migrationen der Reihe nach aus. (In den Datenbanktabellen wird entschieden, welche "neu" sind.)

Sie können jedoch auch jede Migration nach Nummer angeben, und South migriert Ihre Datenbank entweder vorwärts oder rückwärts , um sie an diesen Punkt zu bringen. Wenn Sie also mit den obigen Beispieldateien bereits auf 0003 migriert sind und 0003 in umgekehrter Reihenfolge ausführen möchten (effektiv rückgängig machen), werden Sie ausgeführt

./manage.py migrate your_app 0002

South würde sich die Datenbank ansehen, feststellen, dass bereits 0003 ausgeführt wurde, und feststellen, dass die umgekehrte Migration für 0003 ausgeführt werden muss, um zu 0002 zurückzukehren.

Ian Clelland
quelle
1
Wenn Sie Ihre nächste Migration erstellen, werden die dazwischen liegenden nicht übersprungen, sodass Sie sie später einfach erneut migrieren. Es scheint, als gäbe es einen besseren Weg.
mlissner
44
@mlissner Wenn Sie wirklich wollen, gehen Sie nach dem Zurücksetzen der Datenbank in den Migrationsordner der angegebenen App (im obigen Beispiel your_app / migrations) und löschen Sie die unerwünschte Migration
Josh Russo
1
Genau - Süd überspringt niemals Migrationen; Es wird erwartet, dass die Dateien von 0001-nnnn einen konsistenten Satz von Migrationen für jeden Wert von nnnn darstellen. Wenn dies nicht der Fall ist, müssen Sie die betreffenden selbst neu bestellen oder löschen.
Ian Clelland
217

Nur für den Fall, dass sich jemand (wie ich) gefragt hat, wie er von der ursprünglichen (0001) zurück migrieren soll :

django-admin.py migrate some_app zero

Ausgabe:

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

"Null" ist ein Sonderzustand vor jeder Migration.

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

Strg-C
quelle
6
Jemand hat migrate 0001 --fake ausgeführt, und dies war die einzige Möglichkeit, 0001 rückwärts auszuführen. Vielen Dank!
jmanning2k
1
Sehr wichtige Antwort, ich fragte mich, warum migrate 0000nicht funktioniert. Über die gefälschte Migration, ja, Sie benötigen sie möglicherweise, wenn Sie z. B. nur die (wahrscheinlich falsche) anfängliche Migration rückgängig machen müssen, aber der Migrationsverlauf denkt, dass diese Migration nie stattgefunden hat.
Tomasz Gandor
3

Fügen Sie am Ende der Parameter einen Migrationsnamen hinzu:

./manage.py migrate app-name 00xx-migration-name
Jerzyk
quelle
2
Es ist in Ordnung, und das habe ich schon einmal gemacht, aber es ist viel Tippen / Einfügen. Die bloße "Zustands" -Nummer - in diesem Fall 00xx- reicht aus. Wenn Sie eine Migration verbessern und testen, können Sie beide Befehle im Verlauf haben: vorwärts (kein Argument), rückwärts mit der vorherigen Statusnummer.
Tomasz Gandor