69 votes

mise à jour de la base de données 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é quelques champs au modèle, j'ai essayé syncdb à nouveau, mais aucune sortie n'apparaît. Lorsque j'essaie d'accéder à ces nouveaux champs à partir de mes modèles, j'obtiens une exception "No Such Column", ce qui me laisse penser que syncdb n'a pas réellement mis à jour la base de données. Quelle est la bonne commande à utiliser ?

2 votes

Vous devez modifier la réponse acceptée.

138voto

zlovelady Points 2572

À partir de la version 1.7+ de Django, la fonction intégrée support des migrations permet des migrations de schémas de bases de données qui préservent les données. C'est probablement une meilleure approche que la solution ci-dessous.

Une autre option, qui ne nécessite pas d'applications supplémentaires, consiste à utiliser l'interface intégrée de l'application 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 la base de données pour votre application, mais détruire 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 rompent 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 suit :

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

(Le reset a été dépréciée puis supprimée dans Django 1.5 )

Si les modifications que vous apportez entraînent une rupture de l'ancien schéma, cela ne fonctionnera pas. Sud o L'évolution de Django sont formidables.

0 votes

Merci pour ça. C'est exactement ce que je cherchais.

0 votes

Je pense que cette solution est la meilleure.

0 votes

+J'aimerais utiliser quelque chose qui se trouve déjà dans Django sans avoir à utiliser d'autres applications Django.

33voto

kender Points 18446

On dirait que ce dont vous avez besoin est un système de migration. Sud est vraiment agréable, fonctionne bien, dispose de quelques outils d'automatisation pour faciliter votre travail. Et il a un grand tutoriel .


note : syncdb ne peut pas mettre à jour vos tables existantes. Parfois, il est impossible de décider ce qu'il faut faire automatiquement - c'est pourquoi les scripts du sud sont si formidables.

6 votes

Merci de nous avoir signalé cet outil intéressant. Pour ceux qui sont intéressés, il y a une discussion approfondie sur la migration des bases de données de django ici : code.djangoproject.com/wiki/SchemaEvolution

0 votes

Le lien de South indique : "South a été déprécié. À partir de Django 1.7, les migrations sont intégrées au noyau de Django. Si vous utilisez une version antérieure, vous pouvez trouver le dépôt sur BitBucket". Alors... et maintenant ?

0 votes

Les liens dans la réponse sont cassés

9voto

Juan Besa Points 793

Le 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 la suivante :

  1. Changez d'abord la classe du modèle.
  2. Puis lancez : manage.py sql myapp.
  3. Regardez le sql qu'il imprime et voyez comment il a représenté le changement que vous allez faire.
  4. Effectuez la modification manuellement en utilisant votre gestionnaire de base de données.
  5. Vérifiez si tout a fonctionné correctement en utilisant le site d'administration.

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

0 votes

En fait, je pense que c'est la meilleure et la plus simple des solutions.

8voto

Thomas Kremmel Points 4100

Un autre outil serait django evolution. Il n'est pas nécessaire de supprimer des tables dans la plupart des cas.

évolution de django

Il suffit de l'installer comme toute autre application django et de l'exécuter :

python manage.py evolve --hint --execute

3voto

Antony Hatchkins Points 5831

deseb est un excellent outil pour cela.

Après l'avoir 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.

0 votes

Ça ressemble à ce dont j'avais besoin. Est-ce que sqlevolve engage aussi les changements ?

0 votes

Malheureusement, il est inutilisable maintenant :-(

0 votes

@BerndWechner J'ai eu l'habitude de le supporter (dans mon propre fork) pendant assez longtemps, mais makemigrations s'améliore de plus en plus et constitue aujourd'hui la solution idéale pour les migrations de schémas.

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