django syncdb und ein aktualisiertes Modell

86

Ich habe kürzlich mein Modell aktualisiert und ein BooleanField hinzugefügt. Wenn ich dies jedoch tue python manage.py syncdb, wird das neue Feld nicht zur Datenbank für das Modell hinzugefügt . Wie kann ich das beheben?

Hellnar
quelle
17
Die Tatsache, dass Django eine so grundlegende Sache nicht sofort unterstützt, hat mich davon abgehalten, damit überhaupt Modelle zu erstellen. Die Tatsache, dass sie ein ORM, das die Tabellenerstellung, aber keine (direkte) Tabellenänderung übernimmt, als Release-Qualität betrachten, hat mich fast davon abgehalten, Django vollständig zu verwenden.
Glenn Maynard
3
Die Tatsache, dass Django eine so großartige App-Plug-Fähigkeit ermöglicht, macht Django großartig und macht den Mangel an integrierter Unterstützung für Tabellenänderungen grundsätzlich irrelevant. Wie schwer ist die Installation einer App?
Dominic Rodger
@Glenn, planen Sie Ihre Modelle während Ihrer Entwurfsphase richtig und Sie werden dieses Problem nicht haben. Wenn Sie neue Funktionen hinzufügen, verwenden Sie eine Migrationssuite wie South. In-Place-Migrationen sind oft kompliziert. Für einen einfachen Django-Verwaltungsbefehl sowieso viel zu kompliziert.
Soviut

Antworten:

100

Ab Django 1.7

Django hat Unterstützung für Migrationen eingebaut - sehen Sie sich die Dokumentation an .

Für Django 1.6 und früher

Django unterstützt keine sofort einsatzbereiten Migrationen. Es gibt eine steckbare App für Django, die genau das tut, und sie funktioniert großartig. Es heißt Süden .

Dominic Rodger
quelle
1
Hinweis: Ich hatte Probleme mit South für die Migration von Modellen mit einem benutzerdefinierten DB-Backend (wie django-mssql)
Don
1
Süden ist sehr sehr schön! Vielen Dank für den Tipp
Julien Greard
14

Django macht dies derzeit nicht automatisch. Ihre Optionen sind:

  1. Löschen Sie die Tabelle aus der Datenbank und erstellen Sie sie mit syncdb in neuer Form neu.
  2. Drucken Sie SQL für die Datenbank mit aus python manage.py sql (appname), suchen Sie die hinzugefügte Zeile für das Feld und fügen Sie sie manuell mit dem alter tableSQL-Befehl hinzu. (Auf diese Weise können Sie auch die Werte des Felds für Ihre aktuellen Datensätze auswählen.)
  3. Verwenden Sie Süd (gemäß Dominics Antwort ).
che
quelle
11

Folge diesen Schritten:

  1. Exportieren Sie Ihre Daten mit dem Befehl dumpdata management in ein Fixture
  2. Lass den Tisch fallen
  3. Führen Sie syncdb aus
  4. Laden Sie Ihre Daten mit dem Befehl loaddata management vom Fixture neu
Soviut
quelle
Ein komplettes Drop-and-Reload für etwas, das vor Ort erledigt werden sollte? Das ist schrecklich.
Glenn Maynard
3
Es ist ein einfacher Verwaltungsbefehl, keine Migrationssuite! Django kann nicht vorhersagen, wie sich Ihre Daten geändert haben oder wie sie aufbewahrt werden sollen, und besteht darauf, dass Sie dies selbst tun. Wenn es Ihnen nicht gefällt, verwenden Sie ein Migrationstool wie South.
Soviut
8

Wie in Top-Antwort vorgeschlagen, habe ich versucht , mit Süd , und nach einer Stunde der Frustration mit obskuren Migrationsfehlern entschieden zu gehen mit Django - Evolution statt.

Ich denke, es ist einfacher, damit anzufangen als mit South, und es hat beim ersten Tippen perfekt funktioniert ./manage.py evolve --hint --execute, also bin ich damit zufrieden.

Dan Abramov
quelle
7
Nachdem ich Django Evolution und South fast ein Jahr lang benutzt habe, ändere ich meine Meinung. Der Süden ist großartig. Aber es ist Git sehr ähnlich in dem Sinne , dass Sie sicherstellen müssen, dass Sie wirklich verstehen, wie es funktioniert . Wenn Sie Befehle blind eingeben, werden Sie höchstwahrscheinlich Fehler machen, wenn Sie oder jemand in Ihrem Team zum ersten Mal einen Fehler macht.
Dan Abramov
2

Havent hat Django eine Weile benutzt, aber ich scheine mich zu erinnern, dass syncdb Änderungsbefehle für DB-Tabellen ausführt. Sie müssen die Tabelle löschen und dann erneut ausführen, und sie wird erneut erstellt.

edit: sorry führt KEINE Änderung durch.

Alex H.
quelle
Dann werden keine alter tableBefehle ausgeführt, sondern create tableBefehle.
Dominic Rodger
Nun, ich habe Daten in der Datenbank, also wäre es großartig, wenn ich dieses Problem überwinden würde, ohne es fallen zu lassen.
Hellnar
1
Ich denke, Sie wollten sagen, dass syncdb KEINE Änderungsbefehle ausführt. Sie müssen die Tabelle nicht löschen, sondern können das neue Feld auch manuell zu Ihrem SQL hinzufügen.
Odif Yltsaeb
Ja, aber die Frage bezog sich auf die Verwendung von Syncdb. In diesem Fall müssten Sie die Tabelle löschen, um Syncdb zu verwenden, oder das unten erwähnte Plugin verwenden.
Alex H
1
Wenn Sie mit South frustriert sind, versuchen Sie stattdessen Django Evolution. Hat gut für mich funktioniert. stackoverflow.com/questions/1605662/…
Dan Abramov
1

In Django 1.6

  • Zuerst sind wir gelaufen - python manage.py sql <app name>

  • Dann müssen wir rennen - python manage.py syncdb

Monwara Hossain Munni
quelle
0

Wenn Sie Django mit Apache und MySQL ausführen, starten Sie Apache neu, nachdem Sie die Migration mit Makemigrations durchgeführt haben .

Felipe Perry
quelle