South generiert oder wendet keine Migrationen für vorhandene Apps an, mit zu migrierenden Änderungen

8

Ich verwende South, um Migrationen zu generieren und anzuwenden, anstatt das selbst zu verwalten. Leider weigert sich South, irgendetwas zu tun. Abschrift unten:

%Vor%

Wie Sie sehen können, denkt South, dass es nichts zu tun gibt. Die letzten drei Modelle sind jedoch komplett neu und haben keine Tabelle in der Datenbank.

Gibt es etwas, was ich tun kann, ohne die Datenbank zu zappen, damit South wieder funktioniert?

Ich habe nicht die Absicht, Migrationen für den Rest des Projekts manuell zu schreiben, aber wenn es helfen würde, würde ich eine Migration schreiben.

    
Marcin 04.09.2011, 15:41
quelle

4 Antworten

2

Von der Abteilung für schmutzige Hacks:

Dieser Prozess hat mein Problem gelöst, aber es ist nicht elegant.

(1) Entfernen Sie alle Migrationen in der betroffenen App ( rm mainapp/migrations/* )

(2) Entfernen Sie Ihre models.py und ersetzen Sie sie durch eine leere Datei ( mv mainapp/models.py .; rm mainapp/*.pyc; touch mainapp/models.py )

(3) Erstellen Sie eine initiale Migration, die nichts tut ( python ./manage.py schemamigration mainapp --initial ), und wenden Sie sie an ( python ./manage.py migrate mainapp )

(4) Stellen Sie die Modelle wieder her und erzeugen Sie eine Migration, die alles neu erstellt ( rm mainapp/models.py; mv models.py mainapp/; python ./manage.py schemamigration mainapp --auto )

(5) BEVOR Sie die neue Migration ausführen, bearbeiten Sie sie, um alle Änderungen auskommentieren, die nicht wirklich neue Änderungen sind. Alternativ, führen Sie es aus und lassen Sie es auf den tatsächlich vorhandenen Tabellen fehlschlagen, und kommentieren Sie dann alles aus.

(6) Wenden Sie Ihre Migration an, um sie in einen normalen Zustand zu versetzen (und führen Sie Ihre Änderungen durch, wenn Sie in Schritt (5) meinem empfohlenen Kurs gefolgt sind: python ./manage.py migrate mainapp )

Bessere und sauberere Vorschläge sind willkommen, ebenso wie Hinweise darauf, was dieser Ansatz sonst noch brechen könnte.

    
Marcin 04.09.2011, 16:11
quelle
9

Ich nehme an, du hast dich selbst in Schwierigkeiten gebracht, indem du nicht mit ./manage.py convert_to_south mainapp angefangen hast. Vielleicht können Sie dies korrigieren, indem Sie Folgendes tun:

(1) Machen Sie South glauben, dass Sie die erste Migration nicht durchgeführt haben, also gehen Sie zu Null

./manage.py migrate --fake mainapp zero

(2) Migrieren Sie für Real auf die erste Migration.

./manage.py migrate mainapp

Aber was ich von Ihrer Frage halten kann, Sie hatten bereits einige Modelle in Ihrer Datenbank ohne South gemacht, sonst hätten Sie --initial nicht benutzen müssen. Wenn es so ist, wird es sich wahrscheinlich über bereits vorhandene Spalten beschweren.

Sie können diese Situation ändern mit:

(1) Löschen der ersten Schemamigration durch Löschen von mainapp / migrations / 0001_initial.py. Sie müssen nicht direkt mit der South-Datenbanktabelle herumspielen, --delete-ghost-migrations kümmert sich darum.

(2) ./manage.py syncdb South erwartet, dass die Datenbank mit den Modellen synchronisiert ist.

(3) ./manage.py convert_to_south mainapp , damit South die Datenbank und die Migrationen tatsächlich behandelt.

(4) ./manage.py migrate --delete-ghost-migrations mainapp , um zur ersten Migration zu wechseln und die alte erste Migration zu löschen, die Sie aus Migrationen / aus der Datenbank gelöscht haben

    
Density 21.5 04.09.2011 18:22
quelle
2

Beachten Sie auch, dass das Löschen des Migrationsverlaufs aus der Datenbank nicht hilfreich ist, wenn Sie einen QuerySet-Cache wie Johnny Cache verwenden. Sie müssen entweder memcached: killall memcached oder für Projekte in der Produktion die Tabelle south_migrationhistory mithilfe der folgenden Anweisung ungültig machen mit python manage.py shell :

%Vor%

Das war der Fall für mich.

    
hurturk 10.02.2013 19:15
quelle
1

Wenn Sie bereits eine Datenbank erstellt haben, müssen Sie Folgendes verwenden:

%Vor%

statt Schemamigration. Wenn es dafür zu spät ist und Sie sich nicht um die Daten in Ihrer Datenbank kümmern, führen Sie Folgendes aus:

  1. löschen Sie die Datenbank mit: %Code%
  2. lösche alte Migrationen mit: python manage.py flush
  3. sudo rm /path/to/myapp/migrations/*.*
  4. python manage.py syncdb
johnmic07 16.12.2013 03:58
quelle