(Je sais qu'il y a un titre identique, mais la question est différente).
J'ai réussi à synchroniser les migrations de mes machines de développement et de production.
J'ai une application Django qui utilisait le sud. J'avais mon propre flux de travail qui fonctionnait bien (ce n'était probablement pas la bonne façon de faire les choses, mais cela ne me posait aucun problème).
En gros, j'ai un script qui copie le dump de la base de données de production sur ma machine de développement. Il a également copié les fichiers de migration. De cette façon, les deux étaient synchronisés et je pouvais exécuter les commandes Sud normalement.
Maintenant, je suis passé à la version 1.7 et j'ai commencé à utiliser les migrations. Lorsque j'utilise mon flux de travail précédent (copie de la base de données de copie et fichiers de migration de la production), il ne détecte pas les modifications sur ma machine de développement.
J'ai parcouru le document de migration et je constate que la bonne façon de l'utiliser consiste à:
En tous cas. Tout est en désordre maintenant. Je voudrais "réinitialiser" mes migrations et recommencer à zéro, en faisant les choses correctement à partir de maintenant.
Qu'est-ce que je dois faire?
Ai-je oublié quelque chose? Y a-t-il une raison pour laquelle tout copier depuis la production (base de données et fichiers de migration) ne détecte aucun changement sur ma machine de développement par la suite
Je voudrais juste faire ce qui suit sur les deux environnements (tant que le code est le même)
<your app name>
. Vous pouvez aussi simplement tronquer ce tableau.python manage.py makemigrations
python manage.py migrate --fake
Après cela, toutes vos modifications doivent être détectées dans tous les environnements.
Courir
python manage.py migrate your_app zero
Cela supprimera toutes les tables de votre_app
Si vous voulez, puisque vous avez dit vouloir recommencer, vous pouvez supprimer votre dossier de migrations, ou peut-être renommer le dossier, créer un nouveau dossier de migrations et exécuter
python manage.py makemigrations your_app
python manage.py migrate your_app
Comme dans le sud, vous pouvez toujours aller et venir ...
# Go to the first migration
python manage.py migrate your_app 0001
# Go to the third migration
python manage.py migrate your_app 0003
Alors imaginez que votre 4ème migration est un désastre ... vous pouvez toujours migrer vers la 3ème, supprimez le 4ème fichier de migration et recommencez.
Remarque:
C'est l'une des raisons pour lesquelles vos modèles devraient figurer dans différentes applications. Disons que vous avez 2 modèles: Utilisateur et Note. Il est recommandé de créer deux applications: les utilisateurs et les notes, pour que les migrations soient indépendantes les unes des autres.
Essayez de ne pas utiliser une seule application pour tous vos modèles
Une variation mineure sur la réponse de harshil:
$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>
Cette volonté ...
1)
Commencez par déposer votre base de données en utilisant le langage SQL si vous utilisez un système de base de données tel que Posgres ou MySQL et que vous avez une base de données avec le nom mydb.
delete mydb;
2)
Ensuite, vous devez parcourir tous les dossiers de migration de chaque application appartenant à votre projet et supprimer les fichiers de migration, à l'exception de init.py.
Si vous utilisez un terminal sous Linux/MAC, vous pouvez facilement automatiser ce travail fastidieux .Par exemple
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
3)
Il ne vous reste plus qu’à exécuter la commande de migration que vous invoquez normalement lorsque vous synchronisez vos modèles sur une nouvelle base de données avec Django.
python manage.py makemigrations
python manage.py migrate
Assurez-vous d'avoir créé une nouvelle base de données après avoir supprimé l'ancienne si vous utilisez un système de base de données autre que sqlite.
Lorsque votre application est en production car vous ne pouvez pas supprimer votre base de données, comment réinitialiser les migrations dans ce cas?
Nous avons simplement besoin de conserver la base de données tout en nous débarrassant de l'historique des migrations. Voici comment procéder:
1)
Parcourez d'abord chaque application et supprimez son historique des migrations en exécutant la commande suivante
python manage.py migrate --fake myApp zero
Django désappliquera les migrations précédentes pour l'application spécifique (myApp)
2)
Ensuite, vous devez réellement supprimer le fichier de migration. Vous devrez donc parcourir à nouveau le dossier de migration de chaque application et le supprimer sauf pour init.py. Utilisez simplement le script ci-dessous sous n’importe quel système d’exploitation basé sur Unix.Pour Windows, vous pouvez utiliser le Il devrait ressembler à unix mais sincèrement je n’utilise pas Windows et netier power bash
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
Vous pouvez facilement vérifier vos migrations en utilisant:
python manage.py showmigrations
3)
Ensuite, nous devons créer à nouveau les migrations, alors exécutez simplement
python manage.py makemigrations
MAIS n'oubliez pas que la base de données contient toujours des tables appartenant aux migrations initiales. Nous devons donc migrer notre base de données tout en simulant les migrations initiales. Vous pouvez le faire simplement en exécutant.
python manage.py migrate --fake-initial