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.
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.
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
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
:
Das war der Fall für mich.
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:
python manage.py flush
sudo rm /path/to/myapp/migrations/*.*
python manage.py syncdb
Tags und Links python django migration django-south