web-dev-qa-db-fra.com

Pourquoi mes migrations vers le sud ne fonctionnent-elles pas?

Tout d'abord, je crée ma base de données.

create database mydb;

J'ajoute "sud" aux applications installées. Ensuite, je vais à ce tutoriel: http://south.aeracode.org/docs/tutorial/part1.html

Le tutoriel me dit de faire ceci:

$ py manage.py  schemamigration wall --initial
>>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall

Génial, maintenant je migre.

$ py manage.py migrate wall

Mais ça me donne cette erreur ...

Django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")

J'utilise donc Google (qui ne fonctionne jamais. D'où mes 870 questions posées sur Stackoverflow) et la page suivante s'affiche: http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

Bon, alors je suis ces instructions

>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb

Mais quand je lance syncdb, Django crée un tas de tables. Oui, cela crée la table south_migrationhistory, mais cela crée également les tables de mon application.

Synced:
 > Django.contrib.admin
 > Django.contrib.auth
 > Django.contrib.contenttypes
 > Django.contrib.sessions
 > Django.contrib.sites
 > Django.contrib.messages
 > south
 > fable.notification
 > pagination
 > timezones
 > fable.wall
 > mediasync
 > staticfiles
 > debug_toolbar

Not synced (use migrations):
 - 
(use ./manage.py migrate to migrate these)

Cool .... maintenant, il me dit de migrer ces derniers. Alors, je fais ça:

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.

Très bien, tout va bien. J'ajouterai un mur aux migrations initiales.

$ py manage.py schemamigration wall --initial

Puis je migre:

$ py manage.py migrate wall

Vous savez quoi? Cela me donne ce BS:

_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")

Désolé, ça me fait vraiment chier. Quelqu'un peut aider? Merci.

Comment faire pour que le Sud fonctionne et se synchronise correctement avec tout? La seule chose à laquelle je peux penser est de supprimer mon application d’INSTALLED_APPS, puis d’exécuter syncdb, puis de la rajouter.

C'est SO SILLY.

79
TIMEX

Sud vous permet de créer des migrations lorsque vous démarrez pour la première fois avec une nouvelle application et que les tables n'ont pas encore été ajoutées à la base de données, ainsi que de créer des migrations pour les applications héritées contenant déjà des tables dans la base de données. La clé est de savoir quand faire quoi. 

Votre première erreur était lorsque vous avez supprimé vos migrations, dès que vous avez fait cela, puis lancé Syncdb. Django ne savait pas que vous vouliez que South gère cette application, il a donc créé les tables pour vous. Lorsque vous avez créé vos migrations initiales, puis exécuté votre migration, south essayait de créer des tables déjà créées par Django, et donc votre erreur.

À ce stade, vous avez deux options.

  1. Supprimez les tables de l'application murale de votre base de données, puis exécutez $ py manage.py migrate wall. La migration sera exécutée et les tables seront créées.

  2. Faux lors de la migration initiale $ py manage.py migrate wall 0001 --fake Ceci indiquera au sud que vous avez déjà les tables dans la base de données, alors faîtes-le simplement, ce qui ajoutera une ligne à la table south_migrationhistory, de sorte que la prochaine fois que vous effectuerez une migration, elle le saura que la première migration a déjà été effectuée.

Mise en place d'un tout nouveau projet et pas de base de données

  1. créez votre base de données
  2. ajouter le sud aux applications installées
  3. exécutez syncdb, cela ajoutera les tables Django et sud à la base de données
  4. ajoutez vos applications
  5. pour chaque application exécutée python manage.py schemamigration app_name --initial, cela créera les fichiers de migration initiaux pour votre application.
  6. puis exécutez south migrate python manage.py migrate app_name, les tables seront ajoutées à la base de données.

Mise en place d'un projet hérité et d'une base de données

  1. ajouter le sud aux applications installées
  2. exécutez syncdb, cela ajoutera les tables sud à la base de données
  3. pour chacune de vos applications, lancez python manage.py schemamigration app_name --initial Ceci créera vos migrations initiales
  4. pour chacune de vos applications, lancez python manage.py migrate app_name 0001 --fake, cela simulera le sud, cela ne fera rien à la base de données pour ces modèles, il ajoutera simplement des enregistrements à la table south_migrationhistory afin que la prochaine fois que vous souhaitiez créer une migration, tous ensemble. 

Mise en place d'un projet hérité et pas de base de données

  1. créer une base de données
  2. ajouter le sud aux applications installées
  3. pour chacune de vos applications, lancez python manage.py schemamigration app_name --initial Ceci créera vos migrations initiales
  4. exécutez syncdb, cela ajoutera toutes les applications n’ayant pas de migration vers la base de données.
  5. puis exécutez south migrate python manage.py migrate, ce qui lancera toutes les migrations de vos applications.

Maintenant que vous avez configuré South, vous pouvez commencer à utiliser South pour gérer les modifications de modèle apportées à ces applications. La commande la plus courante à exécuter est python manage.py schemamigration app_name migration_name --auto. Elle examine la dernière migration que vous avez exécutée. Elle détecte les modifications et crée un fichier de migration à votre place. Ensuite, vous devez juste exécuter python manage.py migrate et modifier votre base de données pour vous.

J'espère que cela pourra aider.

174
Ken Cochrane

C'est comme ça que je fais fonctionner les choses.

pip install South

# add 'south', to INSTALL_APPS, then
python manage.py syncdb

# For existing project + database
python manage.py convert_to_south app_name

# Thereafter, call them per model changes
python manage.py schemamigration app_name --auto
python manage.py migrate app_name

Références:

http://garmoncheg.blogspot.com/2011/08/Django-how-and-why-to-use-migrations.htmlhttp://www.djangopro.com/2011/ 01/Django-base-données-migration-outil-sud-expliqué/

10
CppLearner

Le tutoriel que vous utilisez indique:

(Si cela échoue en vous plaignant que South_migrationhistory n'existe pas, Vous avez oublié de lancer syncdb après avoir installé Installé South .)

En supposant que votre message détaille avec précision les étapes que vous avez entreprises, le suivi de ce lien semble indiquer que vous avez manqué une étape avant de configurer votre nouvelle application. Lorsque vous suivez un tutoriel pour configurer les migrations sur une nouvelle application, la commande est la suivante:

  1. Ajoutez south à INSTALLED_APPS.
  2. Exécutez syncdb.
  3. Puis suivez le tutoriel.

C'est-à-dire que vous devriez déjà avoir exécuté syncdb avant d'ajouter les modèles de votre nouvelle application. Votre solution consistant à supprimer votre application de INSTALLED_APPS devrait fonctionner, mais il convient de noter qu'il ne s'agit en réalité que d'une solution "idiote", car vous avez manqué une étape plus tôt. Si syncdb avait été exécuté avant de créer les modèles pour cette application, vous n'auriez pas à utiliser la solution de contournement.

8
Andrew

Juste pour la future réf. Si Sud vous pose des problèmes:

  1. Supprimez les répertoires migrations de vos répertoires d'application
  2. Supprimer Sud _ migrations de votre base de données
  3. Exécuter manage.py syncdb
  4. Revenez à l'utilisation de South (par exemple, './manage.py convert_to_south quelque chose, ./manage.py migrate ...'
3
Sevenearths

Cela semble évident, mais je vous recommande fortement de lire la documentation.

Même après avoir lu les réponses à cette question, j'ai eu du mal à comprendre comment utiliser efficacement South.

Tout cela a bien sûr changé le jour où j'ai lu la documentation et vous devriez le faire, South est plus simple à utiliser que vous ne le pensez.

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

J'ai aussi trouvé cela utile:

http://www.djangopro.com/2011/01/Django-database-migration-tool-south-explained/

Et assurez-vous de lire les articles de Jeff Atwood sur Coding Horror sur le contrôle des versions de base de données.

1
Ashley Davis

Comment faire pour que le Sud fonctionne et se synchronise correctement avec tout? Le seul Ce que je peux penser, c’est de supprimer mon application dans INSTALLED_APPS, puis exécutez syncdb, puis rajoutez-le.

J'ai utilisé cette solution avec les problèmes du Sud dans le passé. Pas une jolie solution mais très efficace;)

Mais le problème principal est que votre commande n'est pas correcte. Vous devriez avoir exécuté syncdb avant le tutoriel. Alors cela fonctionne correctement.

0
Wolph