Quelle est la manière la plus simple d'effacer une base de données de la CLI avec manage.py dans Django?

83

J'utilise Django pour créer un site Web avec MySQL. Maintenant que j'apprends, je dois 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 syncdbne touche pas aux tables existantes. Existe-t-il une meilleure façon de gérer ce problème?

Mirage
la source

Réponses:

152

Si vous ne vous souciez pas des données:

Le meilleur moyen serait de supprimer la base de données et de l'exécuter à syncdbnouveau. 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 ignore l'invite interactive.)

Si vous vous souciez des données:

À partir de 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 d'instructions 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è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 correctes à apporter. Il y a un risque que des données critiques soient perdues au cours du processus.

Si vous avez apporté des modifications à un modèle et souhaitez modifier les tables de la base de données pour qu'elles correspondent, utilisez la commande sql pour afficher la nouvelle structure SQL et comparez-la à votre schéma de table existant pour déterminer 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-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é.

manojlds
la source
4
South 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 de supprimer et de recréer des bases de données pendant le développement, et est un incontournable une fois que votre site est en ligne et que vous devez modifier la structure de la base de données pendant que vous avez des données précieuses.
thepeer
11
COMMANDE DE RÉINITIALISATION DÉPRÉCIÉE . Dans Django 1.5, la commande a été mise à jour vers flush. essayez d'utiliser python manage.py flushou python manage.py flush --noinputpour ignorer l'invite interactive.
agconti
South est obsolète . Référez-vous ici . Et le lien que vous avez donné ici est rompu.
Mukesh Sai Kumar le
Il semble que la commande soit maintenant django-admin flushselon la documentation
Todd
4

Utilisation des extensions Django , 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 (le sud peut vous demander de migrer les choses).

mrmagooey
la source
2
@becko exécutez ceci en premier: pip install django-extensions
FacePalm
4

Je pense que les documents Django mentionnent explicitement que si l'intention est de recommencer à partir d'une base de données vide (ce qui semble être l'intention d'OP), alors supprimez et recréez la base de données et réexécutez migrate(au lieu d'utiliser flush):

Si vous préférez commencer à 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 la migration à la place.

Donc, pour le cas d'OP, il suffit de:

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

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 base de données
Udi
la source
3
resetexécute déjà le SQL, donc pas besoin de diriger vers dbshell. Si vous utilisez la sqlresetcommande, cela afficherait simplement le SQL, que vous pourriez diriger vers le shell pour exécution, mais c'est une étape inutile.
Michael Mior
0

Vous pouvez utiliser la bibliothèque 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-turncate en utilisant votre terminal / ligne de commande:
pip install django-truncate
  1. Ajoutez "django_truncate" à votre INSTALLED_APPS dans le settings.pyfichier:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Utilisez cette commande dans votre terminal pour supprimer toutes les données de la table de l'application.
python manage.py truncate --apps app_name --models table_name
Mahbub Ul Islam
la source