Quelle est l'approche recommandée pour la réinitialisation de l'histoire de la migration à l'aide de Django Sud?
J'ai accumulé assez peu de migrations à l'aide du Sud (0,7) et Django (1.1.2) qui commencent à consommer un peu de temps dans mes tests unitaires. Je souhaite réinitialiser la base de référence et de commencer une nouvelle série de migrations. J'ai passé en revue la Au sud de la documentation, faire l'habitude Google/Stackoverflow de la recherche (par exemple, "django sud (réinitialiser OU supprimer OU retirer) l'histoire de la migration") et n'ai pas trouvé quelque chose d'évident.
Une approche que j'ai envisagé impliquerait de "repartir" en "retrait" du Sud ou de "compensation" l'histoire manuellement (par exemple, effacer la table db, supprimer des fichiers de migration de la migration directeur) et viens de re-exécuter,
./manage.py schemamigration southtut --initial
Donc, si quelqu'un l'a fait avant et a quelques conseils/suggestions seraient grandement appréciés.
- parfois, vous devez l'ajouter manuellement
__init__.py
àappname/migrations
- Comment voulez-vous réinitialiser les migrations en 1.7 (grâce à la migration)?
- docs.djangoproject.com/en/dev/topics/migrations/... pourrait être une approche. Vous pouvez aussi supprimer votre migrations/ répertoires et re-question
./manage.py makemigrations
mais les mauvaises choses qui se passera si vous ne commencez pas à partir d'une nouvelle db... - Je pense que
squashmigrations
est la bonne réponse
Vous devez vous connecter pour publier un commentaire.
D'abord, une réponse par le Sud de l'auteur:
Voici ce que j'ai fais sur mon dev + serveur de production quand j'ai besoin de se débarrasser de tous ces inutiles dev migrations:
* sauf si vous voulez nettoyer la seule application parmi d'autres, si oui, vous aurez besoin de modifier votre south_history de table et de supprimer uniquement les écritures au sujet de votre application.
manage.py schemamigration app name --initial
au lieu de convert_to_south.south.models.MigrationHistory.objects.all().delete()
.manage.py reset south
est dangereux et peut détruire la base de données si il y a un tiers d'applications à l'aide du sud dans le projet, comme l'a souligné @thnee ci-dessous. Depuis votre réponse a tellement de upvotes je l'apprécierais vraiment si vous pouviez modifier et ajouter au moins un avertissement à ce sujet, ou (mieux encore) changer pour refléter @plaques approche (qui est tout aussi pratique, mais n'affecte pas les autres applications) - merci!reset south
n'est pas seulement dangereux pour les applications tierces. Il va effacer l'histoire de la migration de l'ensemble de votre projet de apps. @plaques de cuisson a une meilleure solution par application.Si vous avez besoin de manière sélective (pour une seule application) réinitialiser les migrations qui prennent trop de temps, cette a fonctionné pour moi.
N'oubliez pas de restaurer manuellement tout dépendances sur les autres applications en ajoutant des lignes comme
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
à votre<app-dir>/migrations/0001_initial.py
fichier, comme le premier attribut dans la classe de migration juste en dessous declass Migration(SchemaMigration):
.Vous pouvez ensuite
./manage.py migrate <app-name> --fake --delete-ghost-migrations
sur d'autres environnements, par cette SORTE de réponse. Bien sûr, si vous faux le supprimer ou le fauxmigrate zero
vous aurez besoin de supprimer manuellement les laissés-pour-db tables avec une migration comme cette.Une plus option nucléaire est à
./manage.py migrate --fake --delete-ghost-migrations
sur le serveur de déploiement, suivi par un [ma]sqldump. Alors tuyau de vidage dans [mon]sql sur les environnements où vous avez besoin de la migré, entièrement rempli db. Sud sacrilège, je sais, mais il a travaillé pour moi.DependsOnUnknownMigration
tout en semblant la nouvelle migration initiale. Merci pour votre commentaire, j'ai pu comprendre que je devrais mettre à jour ledepends_on
partout où il se réfère à cette application. C'est vraiment la meilleure réponse ici. Merci! 🙂Merci pour les réponses par Dominique Guardiola et de plaques de cuisson, il m'a aidé à résoudre un problème difficile.
Cependant, il ya un couple de problèmes avec la solution, voici mon prendre sur elle.
À l'aide de
manage.py reset south
est pas une bonne idée si vous avez des applications tierces qui utilise du Sud, par exempledjango-cms
(en gros tout ce qui utilise du Sud).reset south
va supprimer tous l'histoire de la migration de toutes les applications que vous avez installés.Maintenant considérer que la mise à niveau vers la dernière version de
django-cms
, il contiendra de nouvelles migrations comme0009_do_something.py
. Sud sera sûrement confus lorsque vous essayez d'exécuter la migration sans avoir0001
par0008
dans l'histoire de la migration.Il est beaucoup mieux/plus sûr de manière sélective réinitialiser uniquement les applications que vous êtes le maintien de.
Tout d'abord, assurez-vous que vos applications n'ont pas de désynchronisation entre les migrations sur le disque, et les migrations qui ont été exécutées sur la base de données. Sinon, il y aura des maux de tête.
1. Supprimer l'histoire de la migration de mes applications
2. Supprimer les migrations de mes applications
3. Créer de nouveaux initiale migrations de mes applications
4. Faux exécuter la première migrations de mes applications
Cette inserts, les migrations en
south_migrationhistory
sans toucher tables réelles:L'étape 3 et 4 est en fait qu'une variante plus longue de
manage.py convert_to_south my_app
, mais je préfère qu'un contrôle supplémentaire, dans une telle situation délicate que la modification de la base de données de production../manage.py migrate --fake
si vous ne voulez pas faux migrer d'autres applications qui ont des migrations en attente.Comme thnee (voir sa réponse), nous utilisons une approche plus humaine, au Sud de l'auteur, Andrew Godwin) suggestion cités ailleurs ici, et nous sommes séparer ce que nous faisons avec le code de base de ce que nous faisons à la base de données, cours de déploiement, car nous avons besoin de la déploiements pour être reproductible:
Ce que nous faisons dans le code:
Ce que nous faisons à la base de données une fois que le code est déployé
Si vous êtes en train de travailler sur la machine de dev, j'ai écrit une commande de gestion qui fait à peu près ce que Dominique a suggéré.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
En revanche du sud de l'auteur de la suggestion, ce ne sera PAS NUIRE à d'autres applications installées en utilisant du sud.
Qui suit est seulement si vous voulez réinitialiser toutes les applications. Faites une sauvegarde de toutes vos bases de données avant que les travaux. Également la note en bas de votre depends_on dans les fichiers initiaux s'il y a des.
Pour une fois:
Test d'amorçage de votre projet avant de le pousser. Ensuite, pour chaque local/à distance de la machine, s'appliquent suivantes:
N'initiale (3) pour chaque application vous voulez ré-impliquer. Notez que, reset (6) permet de supprimer uniquement l'histoire de la migration, donc pas nocif pour les bibliothèques. Faux migrations (7) va mettre en arrière l'histoire de la migration de toutes les applications 3ème partie installé.
supprimer les fichiers nécessaires à partir de l'app dossier
chemin de l'instance
wiki est mon application