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?
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é.
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).
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:
python manage.py migrate
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: