django syncdb et un modèle mis à jour


86

J'ai récemment mis à jour mon modèle, y ai ajouté un BooleanField, mais lorsque je le fais python manage.py syncdb, il n'ajoute pas le nouveau champ à la base de données du modèle. Comment puis-je réparer cela ?


17
Le fait que Django ne prenne pas en charge une chose aussi fondamentale hors de la boîte m'a empêché de l'utiliser pour créer des modèles. Le fait qu'ils considèrent un ORM qui gère la création de table mais pas la modification de table (sur place) comme étant de la qualité de la version m'a presque empêché d'utiliser Django entièrement.
Glenn Maynard

3
Le fait que Django autorise une si grande capacité d'extension des applications rend Django génial et rend son manque de support intégré pour la modification de table fondamentalement hors de propos. Quelle est la difficulté d'installer une application?
Dominic Rodger

@Glenn, planifiez correctement vos modèles lors de votre phase de conception et vous n'aurez pas ce problème. Si vous ajoutez de nouvelles fonctionnalités, utilisez une suite de migration comme South. Les migrations sur place sont souvent compliquées; beaucoup trop compliqué pour une simple commande de gestion Django de toute façon.
Soviut

Réponses:


100

À partir de Django 1.7

Django a intégré la prise en charge des migrations - jetez un œil à la documentation .

Pour Django 1.6 et versions antérieures

Django ne prend pas en charge les migrations hors de la boîte. Il existe une application enfichable pour Django qui fait exactement cela, et cela fonctionne très bien. Ça s'appelle Sud .


1
Remarque: j'ai eu un problème en utilisant South pour migrer des modèles avec un backend de base de données personnalisé (comme django-mssql)
Don

1
Le sud est très très agréable! Merci pour la pointe
Julien Greard

14

Django ne le fait actuellement pas automatiquement. Vos options sont:

  1. Supprimez la table de la base de données, puis recréez-la sous une nouvelle forme à l'aide de syncdb.
  2. Imprimez SQL pour la base de données à l'aide de python manage.py sql (appname), recherchez la ligne ajoutée pour le champ et ajoutez-la manuellement à l'aide de la alter tablecommande SQL. (Cela vous permettra également de choisir les valeurs du champ pour vos enregistrements actuels.)
  3. Utilisez Sud (selon la réponse de Dominic ).

11

Suivez ces étapes:

  1. Exportez vos données vers un appareil à l'aide de la commande de gestion dumpdata
  2. Déposez la table
  3. Exécutez syncdb
  4. Rechargez vos données depuis l'appareil à l'aide de la commande loaddata management

Une dépose et un rechargement complets pour quelque chose qui devrait être fait sur place? C'est terrible.
Glenn Maynard

3
C'est une simple commande de gestion, pas une suite de migration! Django n'a aucun moyen de prédire comment vos données ont changé ou comment les préserver, il insiste donc pour que vous le fassiez vous-même. Si vous ne l'aimez pas, utilisez un outil de migration comme South.
Soviut

8

Comme suggéré dans la première réponse, j'ai essayé d'utiliser South , et après une heure de frustration avec d' obscures erreurs de migration , j'ai décidé d'utiliser Django Evolution à la place.

Je pense que c'est plus facile de commencer avec que South, et cela a parfaitement fonctionné la première fois que j'ai tapé ./manage.py evolve --hint --execute, donc j'en suis content.


7
Après avoir utilisé Django Evolution et South pendant près d'un an, je change d'avis. Le sud est génial. Mais cela ressemble beaucoup à Git dans le sens où vous devez vous assurer de bien comprendre comment cela fonctionne . Si vous tapez des commandes à l'aveugle, vous ferez très probablement une erreur la première fois que vous ou un membre de votre équipe faites une erreur.
Dan Abramov

2

Havent a utilisé django pendant un certain temps, mais il me semble que je me souviens que syncdb exécute des commandes alter sur les tables db. vous devez supprimer la table puis la relancer et elle se créera à nouveau.

edit: désolé n'effectue PAS de modification.


Ensuite, il ne s'agit pas d'exécuter des alter tablecommandes, mais d'exécuter des create tablecommandes.
Dominic Rodger

eh bien j'ai des données dans la base de données donc ce serait super si je surmontais ce problème sans tomber.
Hellnar

1
Je pense que vous vouliez dire que syncdb n'effectue PAS de commandes de modification. Vous n'êtes pas obligé de supprimer la table, vous pouvez également ajouter manuellement le nouveau champ à votre sql.
Odif Yltsaeb

oui mais la question faisait référence à l'utilisation de syncdb, donc dans ce cas, vous devrez supprimer la table pour utiliser syncdb ou utiliser le plugin mentionné ci-dessous.
Alex H

1
Si vous êtes frustré par South, essayez plutôt Django Evolution. A bien fonctionné pour moi. stackoverflow.com/questions/1605662/…
Dan Abramov

1

Dans django 1.6

  • Au début, nous avons couru - python manage.py sql <app name>

  • Ensuite, nous devons courir - python manage.py syncdb


0

Si vous exécutez Django avec Apache et MySQL, redémarrez apache après avoir effectué la migration avec makemigrations .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.