Gibt es eine Möglichkeit, ein CharField in ein TextField zu ändern und die Daten aus dieser Spalte intakt zu halten?
Im Moment habe ich Folgendes:
%Vor%Aber der DB_MAX_CHAR_LENGTH ist 500, und wie sich herausstellt, kann dieses Feld das manchmal übersteigen, also möchte ich zu:
gehen %Vor%Wie mache ich das und halte meine Daten in der Produktionsdatenbank intakt?
Djangobook erläutert, wie Felder hinzugefügt und entfernt werden können, und ich habe versucht, South dazu zu verwenden Nun, aber South gab mir einen Fehler, und wenn ich auf die Ausgabe von vor dem Fehler schaue, scheint es, als würde South die DB fallen lassen und neu erstellen. Geht es um die Datenmigration im Süden?
Angenommen, Sie haben Zugriff auf die Datenbank, da Sie erwähnt haben, wie Django über das Hinzufügen und Entfernen von Spalten spricht, habe ich Methoden für PostgreSQL und MySQL aufgelistet, da Sie nicht erwähnt haben, was Sie verwenden.
%Vor%Ich würde dringend empfehlen, Ihre Datenbank zu sichern, bevor Sie diese Änderungen vornehmen.
Auf der anderen Seite würde ich weiter nach Süden suchen. Dies ist der Workflow, den ich versuchen würde:
1) South-Schema-Migration, um zwei neue TextField-Felder zu erstellen, die so etwas wie "failed_reqs_txt" und "passed_reqs_txt" genannt werden.
2) Erstellen Sie eine Datenmigration, um die Daten von den alten Feldern in die neuen Felder zu migrieren
3) Erstellen Sie eine Schemamigration, um die ursprünglichen Felder "failed_reqs" und "passed_reqs" zu löschen.
---- Wenn Sie möchten, dass die Felder den gleichen Namen wie das Original haben, gehe ich dann zu:
4) Erstellen Sie eine Schemamigration, um "failed_reqs" und "passed_reqs" als TextFields hinzuzufügen
5) Erstellen Sie eine Datenmigration, um von "failed_reqs_txt" und "passed_reqs_txt" in die Felder "failed_reqs" und "passed_reqs" zu migrieren.
6) Erstellen Sie eine Schemamigration, um die Felder "failed_reqs_txt" und "passed_reqs_txt" zu löschen.
Obwohl dies viele Migrationen sind, bricht es jede Änderung in atomare Migrationen auf. Ich würde das zuerst versuchen. Ich bin mir nicht sicher, warum South die DB fallen lassen und neu erstellen würde. Haben Sie die Option "convert_to_south" ausgeführt, wenn Sie Ihrem Projekt "Süden" hinzufügen? Ich denke, das täuscht eine Migration vor und lässt Süden wissen, dass es mit einem bestehenden Projekt arbeitet und nicht mit einem neuen.
Alternativ können Sie einige direkte ALTER-Änderungen an der Datenbank vornehmen, um den Spaltentyp zu ändern, und dann model.py von CharField zu TextField aktualisieren. Postgres unterstützt angeblich implizit Datentypen auf diese Weise. (Siehe Abschnitt 5.5.6.) Ich bin mir über mysql nicht sicher, aber ich denke, es funktioniert genauso. (CharField to TextFiled sollte eine kompatible Konvertierung sein)
Unabhängig davon würde ich meine Daten sichern, bevor ich solche Änderungen vornehme. Hoffe das hilft.
Dies wird mit Django-Migrationen (1.7+) gelöst. Wenn Sie den Typ von CharField in TextField ändern, ist die Migration, die erzeugt wird, AlterField, was das Richtige tut.