2016-10-13 3 views
10

In Djangos Migrationscode gibt es einen squashmigrations Befehl, der: "Die Migrationen für app_label bis einschließlich migration_name auf weniger Migrationen reduziert, wenn möglich."Wie kann man die letzten Django-Migrationen erzwingen?

Also, wenn Sie, sagen wir, die ersten 5 Migrationen Squash wollen, wird dies helfen.

Was ist der beste Weg zum Squash Start mit einem bestimmten migration_name?

In einem Projekt, an dem ich gerade arbeite, haben wir 5-10 neue Migrationsdateien hinzugefügt, da wir neue Funktionen hinzugefügt haben. Wir werden das gesamte Projekt auf einmal bereitstellen, und es sieht so aus, als würde es zu lange dauern, diese einzeln auszuführen. Ich möchte alle Migrationen für dieses Projekt in eine einzige Migration zerlegen und die Zeit testen, um das auszuführen.

+0

Update dazu - nach Quetschen und Testen dauerte es viel zu lange. Ein großer Teil davon war, weil MySQL für jede Spalte, die ich hinzufügte, die gesamte Tabelle kopieren, die Spalte hinzufügen und dann die Tabelle umbenennen würde. Ich benutzte 'sqlmigrate', um das SQL zu betrachten, das ausgeführt werden würde, und kombinierte vier separate ALTER TABLE-Anweisungen zu einem mit vier ADD COLUMN-Abschnitten und führte dies mit' migrations.RunSQL' mit dem 'state_operations'-Argument durch, um die Logik des Migrationsstatus glücklich zu halten. –

Antwort

18
python manage.py squashmigrations <appname> <squashfrom> <squashto> 

python manage.py help squashmigrations 

https://docs.djangoproject.com/en/dev/topics/migrations/#migration-squashing

erstellt aufgenommen werden

Dies gibt Ihnen eine genauere Kontrolle darüber, welche Migrationen zu Squash durchgeführt werden, und Sie können einen saubereren Commit-Verlauf beibehalten. Wenn Sie alle Migrationen löschen und erneut erstellen, können andere Probleme wie zirkuläre Abhängigkeiten auftreten, je nachdem, wie Modelle erstellt werden.

+2

Gute Antwort - _if_ läuft Django 1.9 oder neuer. Leider ist dieses Projekt auf 1.8 –

+2

Dies erhält die akzeptierte Antwort, weil es die Funktionalität von modernen Versionen von Django verwendet. Diejenigen, die noch vor Version 1.9 auf Versionen von Django waren, sollten Dans Antwort sehen. –

6

Sie können die Migrationsdateien einfach löschen und makemigrations erneut ausführen. Wenn Sie eine Dev-Implementierung verwenden, die diese verwendet, sollten Sie migrate back zu der vor der ersten, die Sie löschen, gehen.

Auch ist es wahrscheinlich eine gute Idee, Ihren Code zuerst zu übertragen, falls etwas schief geht.

auch:

Die leichte Komplikation dabei ist, dass, wenn es Code benutzerdefinierten RunPython ist, wird es nicht in der neuen Migration von makemigrations

+0

So sinnvoll und offensichtlich. Ich mache es auch in einem Zweig :-) –

+2

Die leichte Komplikation mit diesem ist, dass, wenn es benutzerdefinierten 'RunPython'-Code gibt, dieser nicht in der neuen Migration enthalten ist, die von' makemigrations' erstellt wurde. –

+0

Wenn Sie ausgewählte Migrationen löschen (sagen wir alle Migrationen nach '__init__'), dann' makemigrations' laufen lassen und eine Nachricht wie 'Sie haben 1 nicht angewendete (n) Migration (en) 'sehen, können Sie' ./manage.py migrate --fake' ausführen, um die Migration (obwohl andere Teammitglieder die vollständige Migration erhalten). – inostia

Verwandte Themen