Django: Der Flush-Befehl löscht die Datenbank nicht vollständig, das Zurücksetzen schlägt fehl

8

Ich habe viele meiner Modelle umgeschrieben, und da ich gerade einen Testserver betreibe, stelle ich ./manage.py myapp zurück, um die db-Tabellen zurückzusetzen, und alles hat gut funktioniert.

Aber ich habe es diesmal versucht, und ich bekomme einen Fehler,

"Der vollständige Fehler: contraint owner_id_refs_id_9036cedd" der Beziehung "myapp_tagger" existiert nicht "

Also dachte ich mir, ich würde einfach die ganze Seite in Ordnung bringen und neu anfangen. Also habe ich ./manage.py flush dann eine Syncdb das hat keinen Fehler ausgelöst und löschte alle meine Daten, aber es hat die Datenbank nicht aktualisiert, da, wenn ich versuche, auf eines meiner Objekte my_app zuzugreifen, bekomme ich eine Spalte nicht gefunden Fehler . Ich dachte, dass Flush sollte alle Tische fallen lassen. Die Syncdb sagte, dass keine Fixtures hinzugefügt wurden.

Ich nehme an, dass der Fehler mit der Tatsache zusammenhängt, dass ich das Tagger-Modell so geändert habe, dass ich einen Fremdschlüssel mit einem Namensbesitzer an ein anderes Objekt gebunden habe.

Ich habe versucht, den Fremdschlüssel-Argumenten related_name hinzuzufügen, und nichts scheint zu funktionieren.

    
DantheMan 28.12.2010, 23:34
quelle

1 Antwort

13
  

Ich dachte, dass Flush sollte alle Tische fallen lassen.

Nein. Laut der Dokumentation wird manage.py flush nicht gelöscht Tabellen. Stattdessen tut es Folgendes:

  

Bringt die Datenbank in den Zustand zurück, in dem sie sich befand, unmittelbar nachdem syncdb ausgeführt wurde. Dies bedeutet, dass alle Daten aus der Datenbank entfernt werden, alle Post-Synchronisations-Handler erneut ausgeführt werden und das initial_data-Fixture erneut installiert wird.

Wie in Kapitel 10 des Django-Buches im Abschnitt "Änderungen an einem Datenbankschema vornehmen" <

  

syncdb erstellt lediglich Tabellen, die noch nicht in Ihrer Datenbank vorhanden sind - es synchronisiert keine Änderungen in Modellen oder führt das Löschen von Modellen aus. Wenn Sie ein Modellfeld hinzufügen oder ändern oder wenn Sie ein Modell löschen, müssen Sie die Änderung in Ihrer Datenbank manuell vornehmen.

Um Ihr Problem zu lösen, müssen Sie also entweder:

  1. Löschen Sie die Datenbank und geben Sie manage.py syncdb erneut aus. Dies ist der Prozess, den ich bei der Entwicklung des Datenbankschemas verwende. Ich benutze eine initial_data Fixture, um einige Testdaten zu installieren, die auch aktualisiert werden müssen, wenn sich das Datenbankschema ändert.
  2. Erteilen Sie manuell die SQL-Befehle, um Ihr Datenbankschema zu ändern.
  3. Benutze Süden .
Matthew Rankin 29.12.2010 00:54
quelle