2009-12-31 2 views
66

Ich habe bereits ein Modell definiert und die zugehörige Datenbank über manager.py syncdb erstellt. Jetzt, da ich dem Modell einige Felder hinzugefügt habe, habe ich erneut versucht, syncdb, aber keine Ausgabe erscheint. Beim Versuch, auf diese neuen Felder über meine Vorlagen zuzugreifen, erhalte ich die Ausnahme "Keine solche Spalte", was mich zu der Annahme verleitet, dass syncdb die Datenbank nicht wirklich aktualisiert hat. Was ist der richtige Befehl hier?Update Django-Datenbank, um Änderungen in bestehenden Modellen widerzuspiegeln

+1

Sie sollten die angenommene Antwort ändern. – User

Antwort

33

Scheint wie, was Sie brauchen, ist ein Migrationssystem. South ist wirklich nett, funktioniert gut, hat einige Automatisierungs-Tools, um Ihren Workflow zu erleichtern. Und hat eine tolle tutorial.


Hinweis: syncdb kann Ihre vorhandenen Tabellen nicht aktualisieren. Manchmal ist es unmöglich zu entscheiden, was automatisch zu tun ist - deshalb sind South-Scripts so großartig.

+6

danke für das Aufzeigen dieses interessanten Werkzeugs. Für alle Interessierten gibt es hier eine aufschlussreiche Diskussion über die Migration von Django-Datenbanken: http://code.djangoproject.com/wiki/SchemaEvolution – theactiveactor

+0

Der Link von South zeigt, dass "South veraltet ist. Ab Django 1.7 sind Migrationen integriert der Kern von Django. Wenn Sie eine frühere Version ausführen, können Sie das Repository auf BitBucket finden. ". So was jetzt? – FaithReaper

+0

Links in der Antwort sind gebrochen –

3

deseb ist ein großartiges Werkzeug dafür.

Wenn Sie es installiert haben, können Sie ./manage.py sqlevolve schreiben und es generiert SQL-Befehle, die notwendig sind, um die Datenbankstruktur mit Ihren Modellen synchron zu halten.

+0

Das sieht aus, als was ich brauchte. Verpflichtet sqlevolve auch die Änderungen? – theactiveactor

2

Sie müssen Ihre Tabellen löschen, bevor Sie sie mit syncdb neu erstellen können.

Wenn Sie Ihre vorhandenen Daten beibehalten möchten, müssen Sie die Datenbank entladen, Ihre Tabellen löschen, syncdb ausführen, um eine neue Datenbank zu erstellen, und dann Ihre alten Daten in Ihre neuen Tabellen laden.

Es gibt Tools, die dabei helfen. In vielen Fällen ist es jedoch genauso einfach, dies manuell zu tun.

8

Djangos Syncdb ändert keine vorhandenen Tabellen in der Datenbank, so dass Sie es manuell tun müssen. Die Art, wie ich es immer mache ist:

  1. Ändern Sie zuerst die Modellklasse.
  2. Dann ausführen: manage.py sql myapp.
  3. Schauen Sie sich den Ausdruck an und sehen Sie, wie er die Änderung darstellt, die Sie vornehmen werden.
  4. Nehmen Sie die Änderung manuell mit Ihrem Datenbankmanager vor.
  5. Überprüfen Sie, ob über die Admin-Site alles korrekt funktioniert hat.

Wenn Sie SQLLite einen guten Manager verwenden, ist die Firefox-Plugin: link

+0

Ich denke eigentlich, das ist die beste und einfachste Lösung – shrimpwagon

8

Ein weiteres Werkzeug würde django Entwicklung sein. In den meisten Fällen ist kein Tischtrinken erforderlich.

django evolution

einfach installieren Sie es wie jede andere django app und laufen:

Python manage.py evolve --hint --execute

137

As of Django 1.7+, built-in migrations support , allows for database schema migrations that preserve data. That's probably a better approach than the solution below.

Eine weitere Möglichkeit, ohne zusätzliche Anwendungen erfordern, Verwenden Sie die integrierten Funktionen manage.py, um Ihre Daten zu exportieren, die Datenbank zu löschen und die exportierten Daten wiederherzustellen.

Mit den folgenden Methoden werden die Datenbanktabellen für Ihre App aktualisiert, werden jedoch alle in diesen Tabellen vorhandenen Daten vollständig gelöscht. Wenn die Änderungen, die Sie an Ihrem App-Modell vorgenommen haben, Ihr altes Schema nicht beschädigen (Sie haben beispielsweise ein neues, optionales Feld hinzugefügt), können Sie die Daten einfach vorher ausgeben und anschließend erneut laden:

Django 1.4.15 und früher

python manage.py dumpdata <your_app> > temp_data.json 
python manage.py reset <your_app> 
python manage.py loaddata temp_data.json 

Django 1.5 und neuere

python manage.py dumpdata <your_app> > temp_data.json 
python manage.py sqlclear <your_app> | python manage.py dbshell 
python manage.py syncdb 
python manage.py loaddata temp_data.json 

(Der Befehl reset wurde verworfen und dann entfernt, in Django 1.5)

Wenn Ihre Änderungen Ihr altes Schema brechen, funktioniert das nicht - in diesem Fall sind Werkzeuge wie South oder Django Evolution großartig.

+0

Danke dafür. Genau das, wonach ich gesucht habe. –

+0

Ich denke, diese Lösung ist am besten. –

+0

danke, die beste Lösung :) –

1

Für die Versionen 1.4.1 und oben Benutzer hat den Befehl zu

python manage.py flush 

geändert Bitte lesen Sie die official document, bevor es als mit allen Ihre Daten werden gelöscht.

+0

Was ich nicht verstehe ist, dass flush die Datenbank tatsächlich so zurücksetzt, wie es nach der Ausführung von' syncdb' war, aber was ist mit den möglicherweise neu hinzugefügten Feldern ? Sie werden nicht erstellt –

33

Ab Django 1.7 können Sie dies jetzt mit nativen Migrationen tun. Führen Sie einfach

python manage.py makemigrations <your app name> 
python manage.py migrate 
Verwandte Themen