Il y a déjà des questions similaires pour South, mais j'ai commencé mon projet avec Django 1.7 et je n'utilise pas South.
Au cours du développement, de nombreuses migrations ont été créées, cependant le logiciel n'est pas encore livré et il n'existe aucune base de données à migrer. Par conséquent, je voudrais réinitialiser les migrations comme si mon modèle actuel était celui d'origine et recréer toutes les bases de données.
Quelle est la manière recommandée de faire cela?
EDIT: Depuis Django 1.8, il existe une nouvelle commande nommée squashmigrations qui résout plus ou moins le problème décrit ici.
django
django-migrations
django-1.7
Kit Fisto
la source
la source
Réponses:
J'ai ça. Je viens de comprendre cela et c'est bien.
Tout d'abord, pour effacer le tableau des migrations:
Supprimer le
app-name/migrations/
dossier ou le contenu.Effectuez les migrations:
Enfin, rangez vos migrations sans apporter d'autres modifications à la base de données:
la source
zero
. Pour le système de migrations Django,<app-name>
est maintenant une nouvelle application etmakemigrations <app-name>
commencera à partir de0001
.--fake
empêche les tables d'être réellement modifiées, les migrations ne doivent être marquées que comme inversées et ne pas être réellement appliquées au schéma. (Ajout de petites explications par souci d'exhaustivité, @ tani-rokk, @Fabrizio)manage.py migrate --fake <app-name> zero
pour effacer le tableau des migrations, puis supprimez <app-name> / migrations / dossier ou son contenu. Puismanage.py makemigrations <app-name>
et enfin fairemanage.py migrate --fake <app-name>
. Cela nettoiera vos migrations sans apporter d'autres modifications à la base de données.Dans la version Django 1.7 des migrations, la fonctionnalité de réinitialisation qui était auparavant dans le sud a été abandonnée au profit de nouvelles fonctionnalités pour «écraser» vos migrations. C'est censé être un bon moyen de contrôler le nombre de migrations.
https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations
Si vous voulez toujours repartir de zéro, je suppose que vous pouvez toujours le faire en vidant la table des migrations et en supprimant les migrations après quoi vous exécuteriez à
makemigrations
nouveau.la source
raise KeyError("Migration %s dependencies reference nonexistent parent node %r" % (migration, parent))
./manage.py squashmigrations myapp 0004
, toutes les migrations seront écrasées avant la migration0004
dans votre applicationmyapp
. Cela créera une seule migration écrasée.J'ai juste eu le même problème. Voici ma solution de contournement.
La
find
commande: http://unixhelp.ed.ac.uk/CGI/man-cgi?findla source
En supposant qu'il s'agit de la structure de votre projet,
vous pouvez exécuter le script remove_migrations.py à partir de l'emplacement indiqué ci-dessus pour supprimer tous les fichiers de migration.
La suppression manuelle peut être fatigante si vous avez un projet élaboré. Cela m'a fait gagner beaucoup de temps. La suppression des fichiers de migration est sûre. Je l'ai fait un énième nombre de fois sans rencontrer de problèmes ... pour le moment.
Cependant, lorsque j'ai supprimé le dossier des migrations
makemigrations
oumigrate
que je n'ai pas recréé le dossier pour moi. Le script s'assure que le dossier de migration avec ses__init__.py
restes en place, ne supprimant que les fichiers de migration.la source
touch migrations/__init__.py
)DELETE FROM django_migrations Where app in ('app1', 'app2');
./manage.py makemigrations
./manage.py migrer --fake
OU, vous pouvez écrire la migration à partir de tout cela
la source
./manage.py makemigrations
travailler, comme ceci:./manage.py makemigrations orders alerts
J'essaye différentes commandes et certaines des réponses m'aident. Seule cette séquence dans mon cas a corrigé les deux dépendances brisées dans les migrations dans MYAPP et nettoyer toutes les migrations passées à partir de zéro.
Avant de faire cela, assurez-vous que la base de données est déjà synchronisée (par exemple, n'ajoutez pas de nouveau champ Modèle ici ou ne modifiez pas les options Meta).
Où 0002 est le numéro de migration renvoyé par la dernière commande makemigrations.
Vous pouvez maintenant réexécuter makemigrations / migrate normalement car la migration 0002 est stockée mais pas reflétée dans la base de données déjà synchronisée.
la source
Si vous ne vous souciez pas des migrations précédentes, qu'en est-il de la suppression de toutes les migrations dans le répertoire migrations /? vous commencerez la séquence de migration à partir de zéro, en prenant votre modèle actuel comme référence comme si vous aviez écrit le modèle entier maintenant.
Si vous ne me faites pas suffisamment confiance pour les supprimer, essayez de les éloigner à la place.
la source
Un moyen simple est
Accédez à chaque application et supprimez les fichiers de migration.
Accédez ensuite à la table django-migrtaions dans la base de données et tronquez-la (supprimez toutes les entrées).
Après cela, vous pouvez à nouveau créer des migrations.
la source
cd vers le répertoire src
cd /path/to/src
supprimer les répertoires de migration
rm -rf your_app/migrations/
notez que cela doit être fait pour chaque application séparément
émigrer
python3.3 manage.py migrate
si vous souhaitez recommencer
python3.3 manage.py makemigrations your_app
la source
Si vous êtes en mode développement et que vous souhaitez simplement tout réinitialiser (base de données, migrations, etc.), j'utilise ce script basé sur la réponse d'Abdelhamid Ba. Cela effacera les tables de la base de données (Postgres), supprimera tous les fichiers de migration, réexécutera les migrations et chargera mes montages initiaux:
Fichier reset-db.sql:
fichier migration.sh:
Fichier load_initial_fixtures.sh:
Assurez-vous simplement de modifier les chemins pour qu'ils correspondent à votre application. J'ai personnellement ces scripts dans un dossier appelé project_root / script / local, et les sources de django sont dans project_root / src.
la source
Après avoir supprimé chaque dossier «migrations» dans mon application (manuellement), j'ai exécuté:
Ensuite, j'ai pensé que je pouvais faire
./manage.py makemigrations
pour les régénérer tous. Cependant, aucun changement n'a été détecté. J'ai ensuite essayé de spécifier une application à la fois:./manage.py makemigrations foo
,./manage.py makemigrations bar
. Cependant, cela a abouti à des dépendances circulaires qui n'ont pas pu être résolues.Enfin, j'ai exécuté une seule commande makemigrations qui spécifiait TOUTES mes applications (sans ordre particulier):
Cette fois, cela a fonctionné - les dépendances circulaires ont été automatiquement résolues (cela a créé des fichiers de migration supplémentaires si nécessaire).
Ensuite, j'ai pu courir
./manage.py migrate --fake
et j'ai repris mon activité.la source