J'ai accumulé pas mal de migrations en utilisant South (0.7) et Django (1.1.2) qui commencent à prendre pas mal de temps dans mes tests unitaires. Je voudrais réinitialiser la ligne de base et démarrer une nouvelle série de migrations. J'ai examiné la documentation du sud , effectué la recherche habituelle de Google / Stackoverflow (par exemple "historique de migration de django south (réinitialiser OU supprimer OU supprimer)") et je n'ai rien trouvé d'évident.
Une approche que j'ai envisagée consisterait à "recommencer" en "supprimant" Sud ou en "effaçant" l'historique manuellement (par exemple, effacer la table de base de données, supprimer les fichiers de migration du directeur des migrations) et simplement réexécuter,
./manage.py schemamigration southtut --initial
Donc, si quelqu'un a déjà fait cela avant et a quelques conseils / suggestions, ils seraient grandement appréciés.
la source
__init__.py
àappname/migrations
./manage.py makemigrations
mais de mauvaises choses se produiront si vous ne démarrez pas à partir d'une nouvelle base de données ...squashmigrations
c'est la bonne réponseRéponses:
Tout d'abord, une réponse de l'auteur du Sud :
Voici ce que je fais sur mon serveur de développement dev + production lorsque je dois me débarrasser de toutes ces migrations de développement inutiles:
* sauf si vous ne souhaitez nettoyer qu'une seule application parmi d'autres, si c'est le cas, vous devrez modifier votre table south_history et supprimer uniquement les entrées concernant votre application.
la source
manage.py schemamigration app name --initial
place 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 s'il y a des applications tierces utilisant south dans le projet, comme indiqué par @thnee ci-dessous. Étant donné que votre réponse a tellement de votes positifs, j'apprécierais vraiment que vous puissiez la modifier et ajouter au moins un avertissement à ce sujet, ou (encore mieux) la changer pour refléter l'approche @hobs (ce qui est tout aussi pratique, mais ne le fait pas affectent d'autres applications) - merci!Si vous avez besoin de réinitialiser de manière sélective (pour une seule application) les migrations qui prennent trop de temps, cela a fonctionné pour moi.
N'oubliez pas de restaurer manuellement toutes les dépendances sur d'autres applications en ajoutant des lignes similaires
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
à votre<app-dir>/migrations/0001_initial.py
fichier, comme premier attribut de votre classe de migration juste en dessousclass Migration(SchemaMigration):
.Vous pouvez alors
./manage.py migrate <app-name> --fake --delete-ghost-migrations
sur d'autres environnements, par cette réponse SO . Bien sûr, si vous simulez la suppression ou la fausse,migrate zero
vous devrez supprimer manuellement toutes les tables de base de données restantes avec une migration comme celle-ci .Une option plus nucléaire consiste à
./manage.py migrate --fake --delete-ghost-migrations
utiliser le serveur de déploiement en direct suivi d'un [my] sqldump. Puis dirigez ce vidage dans [mon] sql sur les environnements où vous avez besoin de la base de données migrée et entièrement remplie. Sacrilège du sud, je sais, mais a travaillé pour moi.la source
DependsOnUnknownMigration
simuler la nouvelle migration initiale. Grâce à votre commentaire, je pourrais comprendre que je devrais mettre à jour ladepends_on
déclaration partout où elle se réfère à cette application. C'est vraiment la meilleure réponse ici. Merci! :)Grâce aux réponses de Dominique Guardiola et aux plaques de cuisson, cela m'a aidé à résoudre un problème difficile. Cependant, il y a quelques problèmes avec la solution, voici mon point de vue.
L'utilisation
manage.py reset south
n'est pas une bonne idée si vous avez des applications tierces qui utilisent South, par exempledjango-cms
(essentiellement tout utilise South).reset south
supprimera tout l'historique de migration pour toutes les applications que vous avez installées.Considérez maintenant que vous mettez à niveau vers la dernière version de
django-cms
, elle contiendra de nouvelles migrations comme0009_do_something.py
. Le sud sera sûrement confus lorsque vous essayez d'exécuter cette migration sans avoir0001
traversé0008
l'histoire de la migration.Il est préférable / plus sûr de réinitialiser de manière sélective uniquement les applications que vous maintenez .
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 mal à la tête.
1. Supprimer l'historique de migration de mes applications
2. Supprimer les migrations pour mes applications
3. Créer de nouvelles migrations initiales pour mes applications
4. Faux exécuter les migrations initiales pour mes applications
Cela insère les migrations
south_migrationhistory
sans toucher aux tables réelles:Les étapes 3 et 4 ne sont en fait qu'une variante plus longue de
manage.py convert_to_south my_app
, mais je préfère ce contrôle supplémentaire, dans une situation aussi délicate que la modification de la base de données de production.la source
./manage.py migrate --fake
si vous ne souhaitez pas simuler la migration d'autres applications qui ont des migrations en attente.Comme Thnee (voir sa réponse), nous utilisons une approche plus douce de la suggestion de l'auteur du sud (Andrew Godwin) citée ailleurs ici, et nous séparons ce que nous faisons avec la base de code de ce que nous faisons à la base de données, pendant le déploiement , car nous avons besoin que les déploiements soient répétables:
Ce que nous faisons dans le code:
Ce que nous faisons à la base de données une fois que ce code est déployé
la source
Si vous travaillez uniquement sur la machine de développement, 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
Contrairement à la suggestion de l'auteur sud, cela ne nuira PAS aux autres applications installées utilisant sud.
la source
Ce qui suit n'est que si vous souhaitez réinitialiser toutes les applications. Veuillez sauvegarder toutes vos bases de données avant ce travail. Notez également votre depend_on dans les fichiers initiaux s'il y en a.
Pour une fois:
Testez le bootstrap de votre projet avant de pousser. Ensuite, pour chaque machine locale / distante, appliquez ce qui suit:
Faites les initiales (3) pour chaque application que vous souhaitez réimpliquer. Notez que reset (6) supprimera uniquement l'historique de migration, donc pas nuisible pour les bibliothèques. Les fausses migrations (7) remettront l'historique de migration de toutes les applications tierces installées.
la source
supprimer le fichier nécessaire du dossier de l'application
chemin de l'instance
wiki -est mon application
la source