90 votes

Quel est le moyen le plus simple de vider une base de données à partir de la CLI avec manage.py dans Django?

Je suis en train d'utiliser Django pour construire un site web avec MySQL. Maintenant, comme je suis en train d'apprendre, j'ai besoin de changer le modèle très souvent, donc je veux que toutes les tables soient effacées et qu'une nouvelle table soit créée.

Mais syncdb ne touche pas aux tables existantes. Y a-t-il un meilleur moyen de gérer ce problème?

172voto

manojlds Points 96599

Si vous ne vous souciez pas des données :

Le meilleur moyen serait de supprimer la base de données et d'exécuter à nouveau syncdb. Ou vous pouvez exécuter :

Pour Django >= 1.5

python manage.py flush

Pour Django < 1.5

python manage.py reset appname

(vous pouvez ajouter --no-input à la fin de la commande pour qu'elle saute l'invite interactive.)

Si vous vous souciez des données :

D'après la documentation :

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

Si vous avez apporté des modifications à un modèle et souhaitez modifier les tables de la base de données pour correspondre, utilisez la commande sql pour afficher la nouvelle structure SQL et comparez-la à votre schéma de table existant pour déterminer les modifications à apporter.

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

Référence : FAQ - https://docs.djangoproject.com/fr/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

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

4 votes

Sud est vraiment, vraiment bon pour gérer automatiquement les migrations. Il faut un peu de temps pour s'y habituer, mais cela évite beaucoup de tracas en abandonnant et recréant des bases de données pendant le développement, et c'est un must une fois que votre site est en direct et que vous devez modifier la structure de la base de données tout en ayant des données précieuses dedans.

11 votes

COMMANDE DE RESET OBSOLÈTE. Dans Django 1.5, la commande a été mise à jour en flush. Essayez d'utiliser python manage.py flush ou python manage.py flush --noinput pour ignorer l'invite interactive.

1 votes

South a été obsolète. Référez-vous ici. Et le lien que vous avez donné ici est cassé.

4voto

mrmagooey Points 1170

En utilisant Django Extensions, exécutez :

./manage.py reset_db

Cela effacera les tables de la base de données, puis en exécutant :

./manage.py syncdb

cela les recréera (south peut vous demander de migrer des éléments).

2 votes

@becko exécutez ceci d'abord : pip install django-extensions

4voto

Anupam Points 7016

Je pense que la documentation de Django mentionne explicitement que si l'intention est de repartir d'une base de données vide (ce qui semble être l'intention de l'utilisateur original), alors il suffit de supprimer et recréer la base de données et de relancer migrate (au lieu d'utiliser flush):

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

Donc, pour le cas de l'utilisateur original, nous devons simplement :

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

0voto

Udi Points 6298

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

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

Attention :

  • Peut ne pas fonctionner correctement sur Windows.
  • Peut conserver d'anciennes tables dans la base de données

3 votes

Le reset exécute déjà le SQL, donc pas besoin de le rediriger vers dbshell. Si vous utilisez la commande sqlreset, alors cela imprimerait simplement le SQL, que vous pourriez rediriger vers le shell pour l'exécution, mais c'est une étape inutile.

0voto

Mahbub Ul Islam Points 93

Vous pouvez utiliser la librairie Django-Truncate pour supprimer toutes les données d'une table sans détruire la structure de la table.

Exemple :

  1. Tout d'abord, installez django-truncate en utilisant votre terminal/ligne de commande :

    pip install django-truncate

  2. Ajoutez "django_truncate" à vos INSTALLED_APPS dans le fichier settings.py :

    INSTALLED_APPS = [ ... 'django_truncate', ]

  3. Utilisez cette commande dans votre terminal pour supprimer toutes les données de la table de l'application.

    python manage.py truncate --apps nom_de_l_application --models nom_de_la_table

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X