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.
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.
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.
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.
python manage.py schemamigration app_name --initial
, cela créera les fichiers de migration initiaux pour votre application.python manage.py migrate app_name
, les tables seront ajoutées à la base de données.python manage.py schemamigration app_name --initial
Ceci créera vos migrations initialespython 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. python manage.py schemamigration app_name --initial
Ceci créera vos migrations initialespython 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.
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é/
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:
INSTALLED_APPS
.syncdb
.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.
Juste pour la future réf. Si Sud vous pose des problèmes:
- Supprimez les répertoires migrations de vos répertoires d'application
- Supprimer Sud _ migrations de votre base de données
- Exécuter manage.py syncdb
- Revenez à l'utilisation de South (par exemple, './manage.py convert_to_south quelque chose, ./manage.py migrate ...'
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.
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.