web-dev-qa-db-fra.com

Comment réinitialiser les migrations dans Django 1.7

(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 à: 

  1. lancez "make migrations" et "migrate" sur ma machine de développement.
  2. lancez "migrate" sur ma machine devlopemnt pour réellement modifier la base de données
  3. Copier les modifications sur, y compris les fichiers de migration.
  4. exécutez "migrer" sur la machine de production. (sans l'étape "makemigrations")

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? 

  1. Supprimer le contenu de la table de migration (sur les deux machines)?
  2. Supprimer le contenu du dossier de migration? (Y compris le fichier init . Py). 
  3. Commencez les migrations conformément à la documentation pour une nouvelle.

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

25
wobbily_col

Je voudrais juste faire ce qui suit sur les deux environnements (tant que le code est le même)

  1. Supprimer votre dossier de migration
  2. DELETE FROM Django_migrations WHERE app = <your app name>. Vous pouvez aussi simplement tronquer ce tableau.
  3. python manage.py makemigrations
  4. python manage.py migrate --fake

Après cela, toutes vos modifications doivent être détectées dans tous les environnements.

50
harshil

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

27
brunofitas

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é ...

  • prétendez annuler toutes vos migrations sans toucher aux tables réelles de l'application
  • supprimer vos scripts de migration existants pour l'application
  • créer une nouvelle migration initiale pour l'application
  • simuler une migration vers la migration initiale pour l'application
14
rrauenza

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 
0
Ahmed Bouchefra