web-dev-qa-db-fra.com

Devrais-je ajouter les fichiers de migration Django dans le fichier .gitignore?

Dois-je ajouter les fichiers de migration Django dans le fichier .gitignore

J'ai récemment eu beaucoup de problèmes avec Git en raison de conflits de migration et je me demandais si je devais marquer les fichiers de migration comme ignorés. 

Si oui, comment pourrais-je ajouter toutes les migrations que j'ai dans mes applications et les ajouter au fichier .gitignore?

83
Michael Smith

Citant la documentation sur les migrations Django :

Les fichiers de migration de chaque application résident dans un répertoire «migrations» à l'intérieur de cette application et sont conçus pour être validés et distribués dans le cadre de sa base de code. Vous devriez les créer une fois sur votre ordinateur de développement, puis exécuter les mêmes migrations sur les ordinateurs de vos collègues, vos ordinateurs intermédiaires et éventuellement vos ordinateurs de production.

Si vous suivez ce processus, vous ne devriez pas avoir de conflit de fusion dans les fichiers de migration.

Pour atténuer les problèmes que vous rencontrez actuellement, vous devez spécifier le référentiel ou la branche contenant la version faisant autorité des fichiers de migration, puis utiliser le mécanisme d'attribut de git pour spécifier la stratégie de fusion "la nôtre" pour ces fichiers. Cela indiquera à git de toujours ignorer les modifications externes apportées à ces fichiers et de préférer la version locale.

86
Sven Marnach

Non.

Cela fait plusieurs fois que je suis passé et je ne peux pas, pour ma vie, trouver un cas où nous avons besoin de migrations dans le repo.

À mon avis, l'enregistrement définitif du schéma est models.py. Si je fusionne un changement et que quelqu'un le tire, tout sera correct quand ils exécuteront makemigrations et migrate. Il n'est pas nécessaire de définir quelle est la stratégie de "la nôtre" pour les migrations.

Si nous devons revenir en arrière, alors nous rétablissons models et migrons. Tout va bien, pas de problèmes, jamais.

Non se plaindre qu'un champ existe déjà, etc.

Je me demande si quelqu'un peut me donner un cas spécifique où il est avantageux pour moi de devoir fusionner les fichiers de migration d'un autre développeur avant de pouvoir me rendre au travail. Je sais que les docs disent que je devrais, alors je suppose que c'est le cas. Mais je n'ai jamais rencontré un seul.

N'importe qui?

12
Rob L

Vous pouvez suivre le processus ci-dessous.

Vous pouvez exécuter makemigrations localement, ce qui crée le fichier de migration. Validez ce nouveau fichier de migration dans le référentiel. 

À mon avis, vous ne devriez pas du tout exécuter makemigrations en production. Vous pouvez exécuter migrate en production et voir que les migrations sont appliquées à partir du fichier de migration que vous avez validé à partir de local. De cette façon, vous pouvez éviter tous les conflits.

IN LOCAL ENV , pour créer les fichiers de migration,

python manage.py makemigrations 
python manage.py migrate

Maintenant, validez ces fichiers nouvellement créés, comme ci-dessous.

git add app/migrations/...
git commit -m 'add migration files' app/migrations/...

IN PRODUCTION ENV , n'exécute que la commande ci-dessous.

python manage.py migrate
7
SuperNova

Citation tirée de la documentation de 2018, Django 2.0. (deux commandes distinctes = makemigrations et migrate)

La raison pour laquelle il existe des commandes distinctes à créer et à appliquer migrations est due au fait que vous allez commettre des migrations vers votre contrôle de version système et expédiez-les avec votre application; ils ne font pas que votre développement plus facile, ils sont également utilisables par d’autres développeurs et en production.

https://docs.djangoproject.com/fr/2.0/intro/tutorial02/

4
trthhrtz

Je ne peux pas imaginer pourquoi vous auriez des conflits, à moins que vous ne modifiiez les migrations d'une manière ou d'une autre? Cela se termine généralement mal - si quelqu'un manque des validations intermédiaires, il ne procédera pas à la mise à niveau à partir de la version correcte et leur copie de la base de données sera corrompue.

Le processus que je suis est assez simple: chaque fois que vous modifiez les modèles d'une application, vous validez également une migration, puis cette migration ne change pas - si vous avez besoin de quelque chose de différent dans le modèle, modifiez le modèle et effectuez une nouvelle migration en même temps que vos modifications.

Dans les projets greenfield, vous pouvez souvent supprimer les migrations et recommencer à zéro avec une migration 0001_ lorsque vous publiez, mais si vous avez du code de production, vous ne pouvez pas (même si vous pouvez réduire les migrations en un seul).

2
Anthony Briggs

La solution généralement utilisée est que, avant toute fusion avec le maître, le développeur doit extraire toutes les modifications à distance. En cas de conflit dans les versions de migration, il doit renommer sa migration local (la migration distante a été exécutée par d'autres développeurs et, éventuellement, en production) en N + 1.

Pendant le développement, il serait peut-être acceptable de ne pas valider les migrations (n’ajoutez pas d’ignorer, mais ne les add pas). Mais une fois que vous êtes entré en production, vous en aurez besoin pour que le schéma reste synchronisé avec les modifications du modèle.

Vous devez ensuite éditer le fichier et changer la dependencies à la dernière version distante.

Cela fonctionne pour les migrations Django, ainsi que pour d'autres applications similaires (sqlalchemy + alambic, RoR, etc.).

2
WhyNotHugo

Gitignore les migrations, si vous disposez de bases de données distinctes pour les environnements de développement, de stockage intermédiaire et de production. Pour dev. fins Vous pouvez utiliser la base de données sqlite locale et jouer localement avec les migrations. Je vous recommande de créer quatre branches supplémentaires:

  1. Master - Nettoyer le code frais sans migration. Personne n'est connecté à cette branche. Utilisé uniquement pour les révisions de code

  2. Développement - développement quotidien. Push/pull accepté. Chaque développeur travaille sur sqlite DB

  3. Cloud_DEV_env - environnement de cloud/serveur distant. Tirez seulement. Conservez les migrations localement sur la machine, qui est utilisée pour le déploiement de code et les migrations à distance de la base de données Dev.

  4. Cloud_STAG_env - environnement STAG cloud/serveur distant. Tirez seulement. Conservez les migrations localement sur la machine, qui est utilisée pour le déploiement de code et les migrations à distance de la base de données Stag

  5. Cloud_PROD_env - environnement de cloud/serveur distant. Tirez seulement. Conservez les migrations localement sur la machine, qui est utilisée pour le déploiement de code et les migrations à distance de la base de données Prod.

Remarques: 2, 3, 4 - les migrations peuvent être conservées dans les pensions mais il doit exister des règles strictes en matière de fusion des demandes d'extraction. Nous avons donc décidé de trouver une personne responsable des déploiements. -er. Il conserve les migrations de base de données distantes chaque fois que des modifications sont apportées aux modèles.

0
Yevhen Dyachenko

C'est comme si vous deviez ajuster votre flux de travail git au lieu d'ignorer les conflits.

Idéalement, chaque nouvelle fonctionnalité est développée dans une branche différente et fusionnée avec une requête pull.

Les relations publiques ne peuvent pas être fusionnées en cas de conflit. Par conséquent, les personnes qui doivent fusionner leurs fonctions doivent résoudre le conflit, migrations comprises.

0
Sdra

Réponse courte Je propose d'exclure les migrations dans le référentiel. Après la fusion du code, exécutez simplement ./manage.py makemigrations et vous êtes tous ensemble.

Réponse longue Je ne pense pas que vous devriez mettre les fichiers de migration dans le référentiel. Cela gâtera les états de migration dans l'environnement de développement d'une autre personne et dans d'autres environnements de prod et de scène. (voir le commentaire de Sugar Tang pour des exemples). 

De mon point de vue, le but des migrations Django est de trouver des écarts entre les états de modèle précédents et les nouveaux états de modèle, puis de les sérialiser. Si votre modèle change après la fusion du code, vous pouvez simplement faire makemigrations pour trouver l'écart. Pourquoi voulez-vous fusionner manuellement et avec précaution d’autres migrations alors que vous pouvez réaliser la même chose automatiquement et sans bug? Documentation Django dit,

Ils * (migrations) * 'ont été conçus pour être principalement automatiques

; s'il vous plaît gardez ça comme ça. Pour fusionner les migrations manuellement, vous devez bien comprendre ce que les autres ont changé et toute dépendance à leur égard. C'est beaucoup de frais généraux et sujettes aux erreurs. Donc, le suivi des modèles de fichiers est suffisant.

C'est un bon sujet sur le flux de travail. Je suis ouvert à d'autres options.

0
Diansheng

Avoir un tas de fichiers de migration dans git est désordonné. Le dossier de migration ne contient qu'un seul fichier que vous ne devez pas ignorer. Ce fichier est le fichier init .yy. Si vous l’ignorez, python ne recherchera plus les sous-modules dans le répertoire. Toute tentative d’importation des modules échouera. La question devrait donc être de savoir comment ignorer tous les fichiers de migration sauf init . Py? La solution est la suivante: Ajoutez '0 * .py' aux fichiers .gitignore et tout se passera à la perfection. 

J'espère que ça aide quelqu'un. 

0
Gizachew Soboksa