2015-03-25 12 views
17

(Ich weiß, dass es einen Titel derselbe ist, aber die Frage ist anders).Wie setze ich Migrationen in Django 1.7 zurück

Ich habe es geschafft, meine Entwicklungsmaschinenmigrationen und Produktionsmigrationen nicht mehr synchron zu bekommen.

Ich habe eine Django App, die South verwendet. Ich hatte meinen eigenen Workflow, der gut funktionierte (es war wahrscheinlich nicht der richtige Weg, aber ich hatte keine Probleme damit).

Grundsätzlich habe ich ein Skript, das den Produktionsdatenbank-Dump auf meinen Entwicklungscomputer kopiert. Es hat auch die Migrationsdateien kopiert. Auf diese Weise waren die beiden synchron, und ich konnte die Befehle im Süden normal ausführen.

Jetzt habe ich auf 1.7 aktualisiert und begann mit Migrationen. Wenn ich meinen vorherigen Workflow verwende (Datenbank-Dump kopieren und Migrationsdateien aus der Produktion), erkennt er keine Änderungen auf meinem Entwicklungscomputer.

Ich habe durch das Migrationen Dokument zu lesen, und ich sehe, dass der richtige Weg, es zu verwenden ist

  1. run „machen Migrationen“ und „Migration“ auf meiner Entwicklungsmaschine.
  2. run "migrieren" auf meinem devlopemnt Maschine, um tatsächlich die Datenbank Änderungen
  3. Kopieren von Änderungen, einschließlich der Migration von Dateien.
  4. ausführen "migrieren" auf der Produktionsmaschine. (ohne den Schritt "Makemigrationen")

Wie auch immer. Es ist jetzt alles ein Durcheinander. Ich möchte meine Migrationen zurücksetzen und von vorne anfangen, indem ich von nun an die Dinge richtig mache.

Was muss ich tun?

  1. Löschen Sie den Inhalt der Migrationstabelle (auf beiden Maschinen)?
  2. Löschen Sie den Inhalt des Migrationsordners? (Einschließlich der Datei init .py).
  3. Starten Sie die Migrationen gemäß der Dokumentation für eine neue.

Habe ich etwas verpasst? Gibt es einen Grund, warum aus der Produktion alles Kopieren (Datenbank und Migrationsdateien) erkennt keine Änderungen an meiner Entwicklung Maschine danach

+0

Löschen Sie einfach die Migration Ordner und neue erstellen ... – rnevius

+0

Done that, erkennt es keine Änderungen. Außerdem müssen Sie die Datenbanktabelle mit dem Migrationsordner synchronisieren. Ich habe mich gefragt, ob es noch etwas gibt. –

Antwort

37

verwenden würde ich nur die beiden folgenden Sie auf den Umgebungen (solange der Code das gleiche ist) Ordner

  1. Löschen Ihre Migrationen
  2. LÖSCHEN VON django_migrations WHERE app = <your app name>. Sie könnten diese Tabelle auch einfach abschneiden.
  3. python manage.py makemigrations
  4. python manage.py migrate --fake

Nach dieser sollten alle Änderungen in Umgebungen werden erkannt.

+0

Das klingt mehr oder weniger nach dem, was ich am Ende gemacht habe. Ich habe versucht zu löschen (und tatsächlich die django_migrations Tabelle umbenennen). Dann entdeckte ich einige App-Migrationen, die von anderen abhingen, also füllte ich diese Einträge in der neuen django_migrations-Tabelle neu. –

+0

Ich habe so viele Antworten auf ähnliche Fragen gesehen, die das komplizierter machen, als es sein muss. Dies ist der Weg, es zu tun. Sauber und einfach. –

+0

Jetzt erkennt Django keine neuen Änderungen mehr; zB Hinzufügen einer Tabelle. irgendwelche Ideen? –

20

Run

python manage.py migrate your_app zero 

Dadurch werden alle Tabellen aus your_app

fallen Wenn Sie möchten, können Sie Ihren Migrationsordner löschen oder den Ordner umbenennen, einen neuen Migrationsordner erstellen und

ausführen

Genau wie im Süden, kann man immer hin und her gehen ...

# Go to the first migration 
python manage.py migrate your_app 0001 

# Go to the third migration 
python manage.py migrate your_app 0003 

So vorstellen, dass Ihr 4. Migration ist ein Chaos ... Sie in die 3. immer migrieren können, entfernen Sie die 4. Migrationsdatei und tun es wieder.

Hinweis:

Dies ist einer der Gründe, Ihre Modelle in verschiedenen Anwendungen sein sollte. Angenommen, Sie haben 2 Modelle: Benutzer und Notiz. Es empfiehlt sich, zwei Apps zu erstellen: Benutzer und Notizen, damit die Migrationen voneinander unabhängig sind.

Versuchen Sie nicht, einen einzigen Antrag für alle Modelle

+0

Alle Tabellen löschen, auf meiner App? Das ist definitiv nicht die Lösung, nach der ich suche. Oder habe ich Ihre Formulierung missverstanden? –

+0

App, nicht Projekt ... sowieso, überprüfen Sie meine Bearbeitung ... Zero wird alles auf der App, nicht das Projekt, vor 0001 löschen ... – brunofitas

+0

Danke für das Update. Ich habe versucht, den Migrationsordner zu löschen, aber keine der Änderungen wird danach erkannt. –

9

Eine geringfügige Veränderung auf Harshil Antwort:

$ manage.py migrate --fake <appname> zero 
$ rm -rf migrations 
$ manage.py makemigrations <appname> 
$ manage.py migrate --fake <appname> 

Dies wird ...

  • so tun, als alle Ihre Migrationen rückgängig zu machen, ohne die eigentlichen Tabellen in der App zu berühren
  • nehmen Sie die vorhandene Migrationsskripten für die App
  • erstellen Sie eine neue anfängliche Migration für die App
  • fälschen eine Migration auf die anfängliche Migration für die App
+0

Das ist das einzige, was bei mir funktioniert hat! Vielen Dank! –

+1

dieser funktioniert für mich. kannst du 'zero' vor' --fake' setzen. so funktionierte es für mich. –

+0

Ich habe es auf das Format aktualisiert, dass '-h' sagt:' Verwendung: ./manage.py migrieren [Optionen] [app_label] [Migrationsname] ' – rrauenza

Verwandte Themen