web-dev-qa-db-fra.com

mise à jour Django pour refléter les changements dans les modèles existants

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?

68
theactiveactor

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.

33
kender

À 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:

Django 1.4.15 et versions antérieures

python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json

Django 1.5 et plus récent

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.

138
zlovelady

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
37
Cassidy Laidlaw

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:

  1. Modifiez d'abord la classe de modèle.
  2. Exécutez ensuite: manage.py sql myapp.
  3. Regardez le sql qu'il imprime et voyez comment il représente le changement que vous allez faire.
  4. Effectuez la modification manuellement à l'aide de votre gestionnaire de base de données.
  5. Vérifiez si tout fonctionne correctement en utilisant le site d'administration.

Si vous utilisez sqllite, un bon gestionnaire est le plugin firefox: link

9
Juan Besa

Un autre outil serait Django evolution. Aucune suppression de table n'est nécessaire dans la plupart des cas.

évolution de Django

Installez-le comme n'importe quelle autre application Django et exécutez:

python manage.py evolve --hint --execute

8
Thomas Kremmel

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.

3
Antony Hatchkins

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.

2
S.Lott

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 .

1
akki