it-swarm.com.de

Zurücksetzen von Migrationen in Django 1.7

(Ich weiß, dass es einen ähnlichen Titel gibt, aber die Frage ist anders). 

Es ist mir gelungen, meine Entwicklungsmaschinen- und Produktionsmigrationen nicht mehr synchron zu machen. 

Ich habe eine Django-App, die Süd verwendete. Ich hatte meinen eigenen Workflow, der gut funktionierte (es war wahrscheinlich nicht der richtige Weg, Dinge zu tun, aber ich hatte keine Probleme damit). 

Im Grunde habe ich ein Skript, das den Dump der Produktionsdatenbank auf meinen Entwicklungscomputer kopiert. Es kopierte auch die Migrationsdateien. Auf diese Weise waren die beiden synchron, und ich konnte wie üblich Befehle nach Süden ausführen. 

Jetzt habe ich ein Upgrade auf 1.7 vorgenommen und mit Migrationen begonnen. Wenn ich meinen vorherigen Workflow (Kopieren von Datenbank-Dumps und Migrationsdateien aus der Produktion) verwende, werden Änderungen auf meinem Entwicklungscomputer nicht erkannt.

Ich habe das Migrationsdokument durchgelesen und sehe, dass es richtig ist, es zu verwenden 

  1. führen Sie auf meinem Entwicklungscomputer "Migrationen ausführen" und "Migrieren" aus.
  2. führen Sie "migrate" auf meinem devlopemnt-Rechner aus, um die Datenbankänderungen tatsächlich vorzunehmen
  3. Kopieren Sie die Änderungen einschließlich der Migrationsdateien.
  4. führen Sie "migrieren" auf der Produktionsmaschine aus. (ohne den Schritt "Makemigrations")

Sowieso. Jetzt ist alles ein Durcheinander. Ich möchte meine Migrationen "zurücksetzen" und von vorne anfangen und die Dinge von nun an richtig machen.

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 das Kopieren aller Daten aus der Produktion (Datenbank- und Migrationsdateien) später keine Änderungen auf meinem Entwicklungscomputer feststellt

25
wobbily_col

Ich würde einfach in beiden Umgebungen Folgendes tun (solange der Code derselbe ist)

  1. Löschen Sie den Migrationsordner
  2. DELETE FROM Django_migrations WHERE app = <your app name>. Alternativ können Sie diese Tabelle auch einfach abschneiden.
  3. python manage.py makemigrations
  4. python manage.py migrate --fake

Danach sollten alle Ihre Änderungen in Umgebungen erkannt werden.

50
harshil

Lauf 

python manage.py migrate your_app zero

Dadurch werden alle Tabellen von Ihrer_App gelöscht

Wenn Sie möchten, können Sie den Migrationsordner löschen oder umbenennen, einen neuen Migrationsordner erstellen und ausführen

python manage.py makemigrations your_app
python manage.py migrate your_app

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

Stellen Sie sich vor, dass Ihre vierte Migration ein Durcheinander ist ... Sie können jederzeit zur dritten migrieren, die vierte Migrationsdatei entfernen und es erneut ausführen. 

Hinweis:

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

Verwenden Sie keine einzige Anwendung für alle Ihre Modelle

27
brunofitas

Eine geringfügige Variante der Antwort von Harshil:

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

Dieser Wille ...

  • geben Sie vor, alle Migrationen rückgängig zu machen, ohne die eigentlichen Tabellen in der App zu berühren
  • entfernen Sie Ihre vorhandenen Migrationsskripts für die App
  • erstellen Sie eine neue anfängliche Migration für die App
  • fälschen Sie eine Migration zur ursprünglichen Migration für die App
14
rrauenza

1)

Beginnen Sie mit dem Löschen Ihrer Datenbank in SQL-Sprache, wenn Sie ein Datenbanksystem wie Posgres oder MySQL verwenden und über eine Datenbank mit dem Namen mydb verfügen

delete mydb;

2)

Als Nächstes müssen Sie alle Migrationsordner für jede App, die zu Ihrem Projekt gehört, durchgehen und die Migrationsdateien mit Ausnahme von init.py löschen

Wenn Sie ein Terminal unter Linux/MAC verwenden, können Sie dieses langwierige Verfahren einfach automatisieren. Zum Beispiel

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

3)

Als nächstes und als letztes müssen Sie nur den Migrationsbefehl ausführen, den Sie normalerweise aufrufen, wenn Sie Ihre Modelle mit Django in einer neuen Datenbank synchronisieren

python manage.py makemigrations
python manage.py migrate

Stellen Sie sicher, dass Sie eine neue Datenbank erstellt haben, nachdem Sie die alte gelöscht haben, wenn Sie ein anderes Datenbanksystem als sqlite verwenden.

Wenn Ihre App in Produktion ist, weil Sie Ihre Datenbank nicht löschen können. Wie können Sie in diesem Fall Migrationen zurücksetzen?

Wir müssen lediglich die Datenbank beibehalten und gleichzeitig den Migrationsverlauf loswerden. So können Sie dies in detaillierten Schritten tun:

1)

Gehen Sie zunächst jede App durch und ermitteln Sie den Migrationsverlauf, indem Sie den folgenden Befehl ausgeben

python manage.py migrate --fake myApp zero

Django wird keine früheren Migrationen für die spezifische App (myApp) aufheben.

2)

Als Nächstes müssen Sie die Migrationsdatei tatsächlich löschen, damit Sie die einzelnen Migrationsordner der App erneut durchlaufen müssen, mit Ausnahme von init.py. Verwenden Sie einfach das folgende Skript unter einem beliebigen Unix-basierten Betriebssystem. Für Windows können Sie die Power-Funktion verwenden commandd line. Es sollte ähnlich wie Unix sein, aber aufrichtig verwende ich kein Windows und Netier Power Bash

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

Sie können Ihre Migrationen einfach überprüfen, indem Sie Folgendes verwenden:

python manage.py showmigrations

3)

Als Nächstes müssen wir die Migrationen erneut erstellen, also einfach ausführen

python manage.py makemigrations

Aber vergessen Sie nicht, dass die Datenbank noch über Tabellen verfügt, die zu den anfänglichen Migrationen gehören. Wir müssen also unsere Datenbank migrieren und gleichzeitig die anfänglichen Migrationen fälschen, die Sie durch einfaches Ausführen ausführen können

python manage.py migrate --fake-initial 
0
Ahmed Bouchefra