Django-Modell von einer App in eine andere verschieben [duplizieren]

8

Ich habe den dummen Fehler gemacht, zu viele Modelle in der gleichen Django-App zu erstellen, jetzt möchte ich sie in drei verschiedene teilen. Das Problem ist: Es gibt bereits Daten in der Produktion von zwei Kunden, daher muss ich jede geplante Schema- / Datenmigration sorgfältig planen (ich benutze django-south). Ich bin unsicher, wie es weitergehen soll, jeder Rat würde sehr geschätzt werden.

(Ich benutze PostgreSQL auf einem Ubuntu-Server 12.4 LTS, wenn das relevant ist)

Ich habe über die Verwendung von db.rename_table nachgedacht, kann aber nicht herausfinden, wie die Fremdschlüssel korrekt aktualisiert werden zu diesen Modellen (alt zu neu) - irrelevant auf der Datenbankebene (da die Tabellenumbenennung bereits abgedeckt wurde), aber nicht so auf der ORM-Ebene.

Aktualisieren : nachdem Sie darüber nachgedacht haben und diese Frage an Programmierer gestellt haben .SE, ich habe beschlossen, die Dinge einfach zu halten und keine Sorgen über Migrationen zwischen den Hauptversionen des Produkts zu machen. Kurzfristig benutze ich einfach db.rename_table , um den neuen Namen zu finden, während auch db_table wie von Daniel Roseman vorgeschlagen verwendet wird, während die Modelle in der alten App bleiben. Beim Upgrade auf eine Hauptversion wechsle ich zur neuen App und lösche alle Migrationen komplett ab (so dass neue Installationen der neuen Version die Datenbank "wie besehen" erstellen, anstatt alle historischen Migrationen zu durchlaufen).

    
mgibsonbr 16.07.2012, 04:36
quelle

3 Antworten

14

Ich verstehe nicht, warum Sie überhaupt eine Datenmigration benötigen.

Verschieben Sie die Modelle einfach in die neue App und fügen Sie ein db_table Einstellung in den inneren Meta-Klassen, um auf die alten Tabellennamen zu zeigen.

    
Daniel Roseman 16.07.2012, 17:31
quelle
3

Ich habe in letzter Zeit etwas Ähnliches in kleinerem Rahmen gemacht und das war mein Prozess:

  1. Erstellen Sie eine neue App und entsprechende Modelle
  2. Ansichten aktualisieren, um neue Modelle zu verwenden
  3. Aktualisieren Sie die Einheiten- / Systemtests, um sicherzustellen, dass nichts kaputt gegangen ist (wichtig!)
  4. Schreiben Sie einen Verwaltungsbefehl, der die neuen Modelle basierend auf den alten Modellen
  5. auffüllt
  6. Bereitstellen von Code
  7. Führen Sie die Migration für neue Modelle aus
  8. Führen Sie das Management-Befehlsskript aus, um neue Modelle zu aktualisieren
  9. Lassen Sie die alte App für 1-2 Wochen und wenn Sie alles gut finden, lassen Sie sie fallen.

Die Gründe, warum ich die Datenmigration nicht verwendet habe:

  1. Nicht vertraut - fühlte, dass die Aufgabe zu wichtig war, um einen Prozess zu verwenden, mit dem ich nicht vertraut war
  2. Mehr komfortable Bewegungsdaten mit Python-Code, dann mit South Magic
  3. Bei Problemen mit der südlichen Migration sind Abhängigkeiten aufgetreten. Ich wollte die Migrationen mit einer Datenmigration nicht noch komplizierter machen. Dies könnte aufgrund meiner mangelnden Vertrautheit mit den Mechanismen einer Datenmigration eine falsche Grundlage sein.
  4. Vielleicht als eine Voreingenommenheit von Punkt 3, habe ich mich davon überzeugt, dass die Verwendung von South rein als ein Schema-Management-Tool der "richtige" Weg ist. Das Erstellen / Aktualisieren von Daten sollte in der Django-Schicht mit Fixtures oder benutzerdefinierten Managementbefehlen erfolgen
super9 16.07.2012 06:11
quelle
1

Die einfachste Lösung, an die ich denken könnte:

  1. Erstellen Sie ein SchemaMigration , indem Sie den Typ jedes Fremdschlüssels für Modelle in der alten App in einen primitiven Typ ändern (einschließlich der darin enthaltenen);
  2. Erstellen Sie die neuen Apps und ihre Modelle normalerweise;
  3. Führen Sie eine Datenmigration von den alten Tabellen zu den neuen durch;
  4. Erstellen Sie ein weiteres SchemaMigration , indem Sie jeden primitiven Typ erneut in einen Fremdschlüssel umwandeln, der jetzt auf die neuen Tabellen zeigt;
  5. Entfernen Sie die alte App aus den Einstellungen und löschen Sie ihre Tabellen.

Mühsam, ja, aber würde es tun. Ich hoffe jedoch auf eine bessere Lösung.

    
mgibsonbr 16.07.2012 04:36
quelle