2010-11-07 9 views
18

ich in der gleichen Ausgabe der Kommentator hier vorgestellt habe laufen: Django South - table already existskeine solche Spalte Fehler in Django App Nach Süd-Migration

Es gab keine Follow-up, so dass ich dachte, dass ich eine neue Frage abgeben würde. Ich habe eine Django-App, deren Migrationen ich mit dem Süden bewältige. Ich fügte ein Feld meinem Modell dann

, die wie erwartet lief. Running

jedoch führte zu einem Fehler, der angibt, dass die Tabelle, die dem Modell, das ich geändert hatte, bereits vorhanden ist. Dies führte mich auf die obige Frage verknüpft, so läuft

./manage migrate my_app --fake 

die Tabelle Fehler behoben, aber jetzt eine Django-Fehler Ich erhalte, dass die Spalte mit dem neuen Feld zugeordnet ist nicht vorhanden.

./manage sqlall my_app 

zeigt das Schema wie erwartet.

Alle Gedanken zur Abhilfe sind willkommen!

Antwort

32

Der wahrscheinlich einfachste Weg für Sie wird sein, Migrationen von Grund auf neu zu starten.

Löschen Sie alle migrations/* Dateien für die App, die Sie versuchen, zu beheben. Stellen Sie Ihren models.py in den Zustand wieder her, der sich gerade in der Datenbank befindet (mit Hilfe von Versionskontroll-Tools, oder einfach die neuen Felder auskommentieren). Initialisieren Sie dann Migrationen:

Dies erstellt einen Datensatz in Migrationen der aktuellen Datenbankstruktur aussieht.

Nun sind Ihre Änderungen an models.py hinzufügen und Süden wird nun, was sich geändert hat:

manage.py schemamigration my_app --auto 
manage.py migrate my_app 
+0

Stellen Sie sicher, dass alle Datenbankeinträge über Schema-Migrationen gelöscht werden, die auch vorher von Süden gemacht wurden (wenn Sie es vermasselt haben). @drew: Ihr Hauptfehler war, dass Sie die Initali-Migration durchgeführt haben sollten und './manage migrate my_app --fake 'ausführen, BEVOR Sie das neue Feld zum Modell hinzufügen! –

+1

@lazerscience 'manage.py migrieren my_app - löschen-Ghost-Migrationen' macht das Ding. – Ski

+0

Oh, tut mir leid. Ich habe das irgendwie übersehen ... –

5

Etwas anderes im Auge behalten sollten: Sie werden häufig diesen Fehler (DatabaseError: no such column: appname_model.fieldname), wenn Sie einen default Wert verwenden in einer ForeignKey Beziehung, und Sie fügen ein Feld zu diesem FK-Modell hinzu.

So etwas wie (in Ihrem models.py):

class MyAppModel(models.Model): 
    my_foreign_key = models.ForeignKey(FkModel, 
             default=lambda: FkModel.objects.get(id=1), 
             null=True) 

Dann in einer neuen Migration Sie ein neues Feld zu Ihrem FkModel hinzufügen:

class FkModel(models.Model): 
    new_field = models.IntegerField('New Field Name', blank=True, null=True) 

Sie erhalten eine Fehlermeldung erhalten, wenn eine Süd laufen schemamigration:

DatabaseError: no such column: myappmodel_fkmodel.new_field

Sie können dies beheben, indem Sie sicherstellen, dass die anfängliche Südmigration diese Standardfunktion lambda enthält, aber den Standardwert bei der nächsten Migration entfernen.

Das hat mich in der Vergangenheit gebissen. Hoffentlich wird es jemandem in der Zukunft helfen.

Verwandte Themen