Was ist der einfachste Weg, eine Datenbank mit manage.py in Django von der CLI zu löschen?

83

Ich benutze Django, um eine Website mit MySQL zu erstellen. Jetzt, da ich lerne, muss ich das Modell sehr oft ändern, damit alle Tabellen gelöscht und neue Tabellen erstellt werden.

Berührt syncdbaber keine vorhandenen Tabellen. Gibt es einen besseren Weg, um dieses Problem zu lösen?

Fata Morgana
quelle

Antworten:

152

Wenn Sie sich nicht für Daten interessieren:

Am besten löschen Sie die Datenbank und führen sie syncdberneut aus. Oder du kannst laufen:

Für Django> = 1,5

python manage.py flush

Für Django <1,5

python manage.py reset appname

(Sie können --no-inputam Ende des Befehls hinzufügen , damit die interaktive Eingabeaufforderung übersprungen wird.)

Wenn Sie sich für Daten interessieren:

Aus den Dokumenten:

syncdb erstellt nur Tabellen für Modelle, die noch nicht installiert wurden. Es werden niemals ALTER TABLE-Anweisungen ausgegeben, um Änderungen zu entsprechen, die nach der Installation an einer Modellklasse vorgenommen wurden. Änderungen an Modellklassen und Datenbankschemata sind häufig mit Mehrdeutigkeiten verbunden, und in diesen Fällen müsste Django die richtigen Änderungen erraten. Es besteht das Risiko, dass kritische Daten dabei verloren gehen.

Wenn Sie Änderungen an einem Modell vorgenommen haben und die Datenbanktabellen entsprechend ändern möchten, verwenden Sie den Befehl sql, um die neue SQL-Struktur anzuzeigen, und vergleichen Sie diese mit Ihrem vorhandenen Tabellenschema, um die Änderungen zu berechnen.

https://docs.djangoproject.com/de/dev/ref/django-admin/

Referenz: FAQ - https://docs.djangoproject.com/de/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

Die Leute empfehlen auch South ( http://south.aeracode.org/docs/about.html#key-features ), aber ich habe es nicht versucht.

Manojlds
quelle
4
South ist wirklich sehr, sehr gut für die automatische Abwicklung von Migrationen. Es ist etwas gewöhnungsbedürftig, aber es erspart viel Aufwand beim Löschen und Neuerstellen von Datenbanken während der Entwicklung und ist ein Muss, sobald Ihre Site online ist und Sie die Datenbankstruktur ändern müssen, während Sie wertvolle Daten darin haben.
Thepeer
11
RESET-BEFEHL DEPRECIATED . In Django 1.5 wurde der Befehl auf aktualisiert flush. Versuchen Sie, die interaktive Eingabeaufforderung zu verwenden python manage.py flushoder python manage.py flush --noinputzu überspringen.
Agconti
Süd ist veraltet . Siehe hier . Und der Link, den Sie hier gegeben haben, ist defekt.
Mukesh Sai Kumar
Es sieht so aus, als ob der Befehl jetzt django-admin flushden Dokumenten entspricht
Todd
4

Mit Django - Erweiterungen , ausgeführt wird :

./manage.py reset_db

Löscht die Datenbanktabellen und führt dann Folgendes aus:

./manage.py syncdb

Wird sie neu erstellen (South kann Sie bitten, Dinge zu migrieren).

mrmagooey
quelle
2
@becko führen Sie dies zuerst aus: pip install django-extensions
FacePalm
4

Ich denke, Django- Dokumente erwähnen ausdrücklich, dass, wenn die Absicht besteht, wieder von einer leeren Datenbank zu starten (was die Absicht von OP zu sein scheint), einfach die Datenbank löschen und neu erstellen und erneut ausführen migrate(anstatt zu verwenden flush):

Wenn Sie lieber von einer leeren Datenbank ausgehen und alle Migrationen erneut ausführen möchten, sollten Sie die Datenbank löschen und neu erstellen und stattdessen die Migration ausführen.

Für den Fall von OP müssen wir also nur:

  1. Löschen Sie die Datenbank aus MySQL
  2. Erstellen Sie die Datenbank neu
  3. Lauf python manage.py migrate
Anupam
quelle
0

Am schnellsten (löscht und erstellt alle Tabellen einschließlich Daten):

./manage.py reset appname | ./manage.py dbshell

Vorsicht:

  • Funktioniert unter Windows möglicherweise nicht richtig.
  • Könnte einige alte Tische in der Datenbank behalten
Udi
quelle
3
resetLäuft bereits in SQL, sodass keine Pipe erforderlich ist dbshell. Wenn Sie den sqlresetBefehl verwenden, wird nur die SQL ausgedruckt, die Sie zur Ausführung an die Shell weiterleiten können. Dies ist jedoch ein unnötiger Schritt.
Michael Mior
0

Mit der Django-Truncate-Bibliothek können Sie alle Daten einer Tabelle löschen, ohne die Tabellenstruktur zu zerstören.

Beispiel:

  1. Installieren Sie zuerst django-turncate über Ihr Terminal / Ihre Befehlszeile:
pip install django-truncate
  1. Fügen Sie "django_truncate" zu Ihrem INSTALLED_APPS in der settings.pyDatei hinzu:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Verwenden Sie diesen Befehl in Ihrem Terminal, um alle Daten der Tabelle aus der App zu löschen.
python manage.py truncate --apps app_name --models table_name
Mahbub Ul Islam
quelle