J'ai déjà défini un modèle et créé sa base de données associée via manager.py syncdb
. Maintenant que j'ai ajouté des champs au modèle, j'ai réessayé syncdb
, mais aucune sortie n'apparaît. En essayant d'accéder à ces nouveaux champs à partir de mes modèles, j'obtiens une exception "No Such Column", ce qui me fait croire que syncdb n'a pas réellement mis à jour la base de données. Quelle est la bonne commande ici?
On dirait que ce dont vous avez besoin est un système de migration. Sud est vraiment sympa, fonctionne très bien, a quelques outils d'automatisation pour faciliter votre flux de travail. Et a un grand tutoriel .
remarque: syncdb ne peut pas mettre à jour vos tables existantes. Parfois, il est impossible de décider quoi faire automagiquement - c'est pourquoi les scripts sud sont si grands.
À partir de Django 1.7+, intégré prise en charge des migrations , permet des migrations de schéma de base de données qui préservent les données. C'est probablement une meilleure approche que la solution ci-dessous.
Une autre option, ne nécessitant pas d'applications supplémentaires, consiste à utiliser les fonctions intégrées manage.py
Pour exporter vos données, effacer la base de données et restaurer les données exportées.
Les méthodes ci-dessous mettront à jour les tables de base de données pour votre application, mais détruiront complètement toutes les données qui existaient dans ces tables. Si les modifications que vous avez apportées à votre modèle d'application ne cassent pas votre ancien schéma (par exemple, vous avez ajouté un nouveau champ facultatif), vous pouvez simplement vider les données avant et les recharger après, comme ceci:
python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json
python manage.py dumpdata <your_app> > temp_data.json
python manage.py sqlclear <your_app> | python manage.py dbshell
python manage.py syncdb
python manage.py loaddata temp_data.json
(La commande reset
a été déconseillée puis supprimée dans Django 1.5 )
Si vos modifications cassent votre ancien schéma, cela ne fonctionnera pas - auquel cas des outils tels que Sud ou Django Evolution sont excellents.
Depuis Django 1.7, vous pouvez maintenant le faire avec les migrations natives. Il suffit d'exécuter
python manage.py makemigrations <your app name>
python manage.py migrate
Syncdb de Django ne modifie pas les tables existantes dans la base de données, vous devez donc le faire manuellement. La façon dont je le fais toujours est:
Si vous utilisez sqllite, un bon gestionnaire est le plugin firefox: link
Un autre outil serait Django evolution. Aucune suppression de table n'est nécessaire dans la plupart des cas.
Installez-le comme n'importe quelle autre application Django et exécutez:
python manage.py evolve --hint --execute
deseb est un excellent outil pour cela.
Une fois installé, vous pouvez écrire ./manage.py sqlevolve et il générera les commandes sql nécessaires pour maintenir la structure de la base de données en synchronisation avec vos modèles.
Vous devez supprimer vos tables avant de pouvoir les recréer avec syncdb
.
Si vous souhaitez conserver vos données existantes, vous devez décharger votre base de données, supprimer vos tables, exécuter syncdb
pour créer une nouvelle base de données, puis recharger vos anciennes données dans vos nouvelles tables.
Il existe des outils qui aident à cela. Cependant, dans de nombreux cas, il est tout aussi facile de le faire manuellement.
Pour les utilisateurs des versions 1.4.1 et supérieures, la commande est devenue
python manage.py flush
Veuillez lire le document officiel avant de l'utiliser car il supprimera toutes vos données .