web-dev-qa-db-fra.com

Quel est le moyen le plus simple d'effacer une base de données de la CLI avec manage.py dans Django?

J'utilise Django pour construire un site Web avec MySQL. Maintenant que j'apprends, je dois changer le modèle très souvent pour que toutes les tables soient effacées et qu'une nouvelle table soit créée.

Mais syncdb ne touche pas les tables existantes. Existe-t-il une meilleure façon de gérer ce problème?

76
Mirage

Si vous ne vous souciez pas des données:

Le meilleur moyen serait de supprimer la base de données et de relancer syncdb. Ou tu peux courir:

Pour Django> = 1.5

python manage.py flush

Pour Django <1.5

python manage.py reset appname

(vous pouvez ajouter --no-input jusqu'à la fin de la commande pour ignorer l'invite interactive.

Si vous vous souciez des données:

De la docs:

syncdb ne créera de tables que pour les modèles qui ne sont pas encore installés. Il n'émettra jamais d'instructions ALTER TABLE pour faire correspondre les modifications apportées à une classe de modèle après l'installation. Les modifications apportées aux classes de modèle et aux schémas de base de données impliquent souvent une certaine forme d'ambiguïté et, dans ces cas, Django devrait deviner les modifications à apporter. Il existe un risque de perte de données critiques Dans le processus.

Si vous avez modifié un modèle et souhaitez modifier les tables de la base de données afin qu'elles correspondent, utilisez la commande sql pour afficher la nouvelle structure SQL et comparez-la à votre schéma de table existant pour gérer les modifications.

https://docs.djangoproject.com/en/dev/ref/Django-admin/

Référence: FAQ - https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model- comment-faire-je-mise-à-jour-la-base de données

Les gens recommandent également South ( http://south.aeracode.org/docs/about.html#key-features ), mais je ne l’ai pas essayé.

134
manojlds

Utiliser Django Extensions , en cours d'exécution:

./manage.py reset_db

Effacera les tables de la base de données puis exécutera:

./manage.py syncdb

Va les recréer (sud peut vous demander de migrer des choses).

4
mrmagooey

Je pense que Django docs mentionne explicitement que si l'intention est de recommencer à partir d'une base de données vide (ce qui semble être l'intention de OP), il suffit alors de supprimer et de recréer la base de données et réexécutez migrate (au lieu d'utiliser flush):

Si vous préférez partir d'une base de données vide et réexécuter toutes les migrations, vous devez supprimer et recréer la base de données, puis exécuter migrate à la place.

Donc, dans le cas de OP, nous devons simplement:

  1. Supprimer la base de données de MySQL
  2. Recréer la base de données
  3. Courir python manage.py migrate
3
Anupam

Le plus rapide (supprime et crée toutes les tables, y compris les données):

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

Mise en garde:

  • Peut ne pas fonctionner correctement sous Windows.
  • Peut garder quelques vieilles tables dans la db
0
Udi