102 votes

Comment supprimer toutes les tables de la base de données avec la CLI manage.py dans Django ?

Comment puis-je supprimer toutes les tables d'une base de données en utilisant manage.py et la ligne de commande ? Existe-t-il un moyen de le faire en exécutant manage.py avec les paramètres appropriés afin de pouvoir l'exécuter depuis une application .NET ?

136voto

Manoj Govindan Points 24030

Pour autant que je sache, il n'existe pas de commande de gestion permettant de supprimer toutes les tables. Si cela ne vous dérange pas de bidouiller Python, vous pouvez écrire votre propre commande personnalisée pour le faire. Vous pouvez trouver le sqlclear option intéressante. La documentation indique que ./manage.py sqlclear Imprime les instructions SQL DROP TABLE pour le(s) nom(s) d'application donné(s).

Mise à jour : S'approprier sans vergogne @Mike DeSimone Le commentaire de l'auteur sous cette réponse pour donner une réponse complète.

./manage.py sqlclear | ./manage.py dbshell

Depuis django 1.9, c'est maintenant ./manage.py sqlflush

0 votes

sqlclear "imprime les instructions de dépôt" mais comment les exécuter en une seule ligne de commande ?

3 votes

vous avez besoin du nom de l'application comme : ./manage.py sqlclear myAppName | ./manage.py dbshell

4 votes

Cela ne fonctionne pas du tout. sqlclear a besoin d'un nom d'application. Je suis sous Django 1.8

44voto

Anuj Gupta Points 2962

Il n'y a pas de commande de gestion native de Django pour supprimer toutes les tables. Les deux sites sqlclear et reset exiger un nom d'application.

Cependant, vous pouvez installer Extensions Django ce qui vous donne manage.py reset_db qui fait exactement ce que vous voulez (et vous permet d'accéder aux services suivants beaucoup plus des commandes de gestion utiles).

0 votes

@JulienGreard Mis à jour. Merci !

4 votes

J'ai renoncé à essayer et j'ai utilisé ceci.

0 votes

Cela a fonctionné pour moi, alors qu'aucune des réponses les mieux classées ne l'a fait.

35voto

Mike DeSimone Points 20059

Si vous utilisez le paquet South pour gérer les migrations de bases de données (ce qui est fortement recommandé), vous pouvez simplement utiliser la commande ./manage.py migrate appname zero commandement.

Sinon, je recommande le ./manage.py dbshell qui introduit des commandes SQL sur l'entrée standard.

0 votes

+1. Tout projet Django non trivial devrait utiliser South. Et une fois que vous utilisez South, migrer vers Zero est une façon idiomatique de laisser tomber toutes les tables.

0 votes

Même les projets Django triviaux devraient envisager le Sud. Juste pour habituer les gens à migrer des bases de données, et pour qu'ils ne prennent pas de mauvaises habitudes comme essayer de vider, pirater et recharger les données à la main, ou utiliser le mécanisme des fixtures pour migrer les données.

0 votes

J'utilise South, mais je ne me donne pas la peine d'écrire des migrations inversées pour chaque migration, notamment les migrations de données. Et je ne le ferais pas juste pour pouvoir utiliser l'option zéro. C'est certainement un bon moyen de tester que vous pouvez revenir directement à zéro, si c'est important pour vous. L'abandon de toutes les tables me semble raisonnable.

7voto

lemanyk Points 61

moyen simple ( ?) de le faire à partir de python (sur mysql) :

from django.db import connection

cursor = connection.cursor()
cursor.execute('show tables;')
parts = ('DROP TABLE IF EXISTS %s;' % table for (table,) in cursor.fetchall())
sql = 'SET FOREIGN_KEY_CHECKS = 0;\n' + '\n'.join(parts) + 'SET FOREIGN_KEY_CHECKS = 1;\n'
connection.cursor().execute(sql)

5voto

Peter G Points 370

Voici un shell script que j'ai fini par assembler pour traiter ce problème. J'espère que cela fera gagner du temps à quelqu'un.

#!/bin/sh

drop() {
    echo "Droping all tables prefixed with $1_."
    echo
    echo "show tables" | ./manage.py dbshell |
    egrep "^$1_" | xargs -I "@@" echo "DROP TABLE @@;" |
    ./manage.py dbshell
    echo "Tables dropped."
    echo
}

cancel() {
    echo "Cancelling Table Drop."
    echo
}

if [ -z "$1" ]; then
    echo "Please specify a table prefix to drop."
else
    echo "Drop all tables with $1_ prefix?"
    select choice in drop cancel;do
        $choice $1
        break
    done
fi

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