Sollte ich die Django-Migrationsdateien zur .gitignore-Datei hinzufügen?

128

Sollte ich die Django-Migrationsdateien in die .gitignoreDatei einfügen?

Ich habe in letzter Zeit aufgrund von Migrationskonflikten viele Git-Probleme bekommen und mich gefragt, ob ich Migrationsdateien als ignorieren markieren soll.

Wenn ja, wie würde ich vorgehen, um alle Migrationen, die ich in meinen Apps habe, hinzuzufügen und der .gitignoreDatei hinzuzufügen ?

Michael Smith
quelle

Antworten:

136

Zitat aus der Django-Migrationsdokumentation :

Die Migrationsdateien für jede App befinden sich in einem "Migrations" -Verzeichnis innerhalb dieser App und sind so konzipiert, dass sie in ihre Codebasis übernommen und als Teil davon verteilt werden. Sie sollten sie einmal auf Ihrem Entwicklungscomputer erstellen und dann dieselben Migrationen auf den Computern Ihrer Kollegen, Ihren Staging-Computern und schließlich auf Ihren Produktionsmaschinen ausführen.

Wenn Sie diesem Prozess folgen, sollten in den Migrationsdateien keine Zusammenführungskonflikte auftreten.

Beim Zusammenführen von Versionskontrollzweigen kann es dennoch vorkommen, dass mehrere Migrationen auf der Grundlage derselben übergeordneten Migration durchgeführt werden, z. B. wenn bei verschiedenen Entwicklern gleichzeitig eine Migration eingeführt wurde. Eine Möglichkeit, diese Situation zu lösen, besteht darin, eine _merge_migration_ einzuführen. Oft kann dies automatisch mit dem Befehl erfolgen

./manage.py makemigrations --merge

Dadurch wird eine neue Migration eingeführt, die von allen aktuellen Kopfmigrationen abhängt. Dies funktioniert natürlich nur, wenn kein Konflikt zwischen den Kopfmigrationen besteht. In diesem Fall müssen Sie das Problem manuell lösen.


In Anbetracht , dass einige Leute hier vorgeschlagen , dass Sie nicht , sollten Sie Ihre Migrationen auf Versionskontrolle verpflichten, würde Ich mag die Gründe erweitern , warum Sie eigentlich sollte dies tun.

Zunächst benötigen Sie eine Aufzeichnung der auf Ihre Produktionssysteme angewendeten Migrationen. Wenn Sie Änderungen in der Produktion bereitstellen und die Datenbank migrieren möchten, benötigen Sie eine Beschreibung des aktuellen Status. Sie können eine separate Sicherung der auf jede Produktionsdatenbank angewendeten Migrationen erstellen, dies scheint jedoch unnötig umständlich zu sein.

Zweitens enthalten Migrationen häufig benutzerdefinierten, handgeschriebenen Code. Es ist nicht immer möglich, sie automatisch mit zu generieren ./manage.py makemigrations.

Drittens sollten Migrationen in die Codeüberprüfung einbezogen werden. Dies sind bedeutende Änderungen an Ihrem Produktionssystem, und es gibt viele Dinge, die mit ihnen schief gehen können.

Kurz gesagt, wenn Sie sich für Ihre Produktionsdaten interessieren, überprüfen Sie bitte Ihre Migrationen in die Versionskontrolle.

Sven Marnach
quelle
24
Wir, ein Entwicklerteam, haben genau das gleiche Problem. Wenn ein Mitglied eine Leistung erbringt makemigrations some_app, sind nicht nur die Modelle betroffen, die unter der Kontrolle dieses Mitglieds stehen, sondern auch andere verwandte Modelle. Das heißt, die Migrationsdateien (00 * _ *) in anderen Apps werden geändert. Und das verursacht viele Konfliktprobleme beim Pushing zu oder Ziehen von GitHub. Da unser System derzeit nicht produktionsbereit ist, haben wir nur .gitignoredie Migrationsdatei. Wir wissen immer noch nicht, wie wir es lösen sollen, wenn das System in Produktion geht. Hat jemand irgendwelche Lösungen?
Randy Tang
2
Wenn ich das gut verstehe, müssen Sie die Migrationen aus Ihrem Projekt ziehen. Wenn Sie etwas ändern, müssen Sie lokale Auswanderungen durchführen. Drücken Sie es erneut und der Buildserver wird die Migration durchführen? (Sehr wichtig natürlich, jeder hat die guten Versionen)
lvthillo
Wir verwenden niemals Django-Migrationen. Jeder stellt eine Verbindung zu einer zentralen Testdatenbank her. Wenn eine Änderung erforderlich ist, erfolgt diese bei Bedarf manuell auf DB-Ebene. Diese Methode funktioniert gut, wenn das System ausgereift genug ist und nicht viele Datenbankschema-Updates benötigt.
Gurel_Kaynak
@ yltang52 Wir versuchen derzeit auch, es herauszufinden. Können Sie uns irgendwelche Erkenntnisse mitteilen? Ich denke, sobald Sie in die Produktion gehen, haben Sie keine andere Wahl, als diese Migrationen beizubehalten, um einfachere Patches und insgesamt eine einfachere Versionskontrolle zu ermöglichen. Ich frage mich auch, was Sie mit Anfangszustandsdaten machen (wie Einstellungen, die in db gespeichert sind). Wie pflegen Sie sie?
Daniel Dubovski
3
Ich denke nicht, dass Sie Migrationsdateien in Repo ablegen sollten. Dies wird die Migrationszustände in der Entwicklungsumgebung anderer Personen und in anderen Produkt- und Bühnenumgebungen beeinträchtigen. (Beispiele finden Sie im Kommentar von Sugar Tang). Die Verfolgung der Modelldatei ist ausreichend.
Diansheng
19

Sie können dem folgenden Prozess folgen.

Sie können makemigrationslokal ausgeführt werden, wodurch die Migrationsdatei erstellt wird. Übernehmen Sie diese neue Migrationsdatei für das Repo.

Meiner Meinung nach sollten Sie überhaupt nicht makemigrationsin Produktion gehen. Sie können migratein der Produktion ausgeführt werden und sehen, dass die Migrationen aus der Migrationsdatei angewendet werden, die Sie von lokal festgeschrieben haben. Auf diese Weise können Sie alle Konflikte vermeiden.

IN LOCAL ENV , um die Migrationsdateien zu erstellen,

python manage.py makemigrations 
python manage.py migrate

Übernehmen Sie nun diese neu erstellten Dateien (siehe unten).

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

Führen Sie in PRODUCTION ENV nur den folgenden Befehl aus.

python manage.py migrate
SuperNova
quelle
3
Meiner Meinung nach sollte die Migrationsdatei erst nach der Bereitstellung der App Teil des Repos sein. Das zählte als erste Migration. Wenn sich die App noch in einer starken Entwicklung befindet, können wir sie ignorieren. Aber sobald es live geht. Das ist es! Das ist das Zeichen dafür, dass Migrationen ins Repo gestellt werden sollten. Alle anderen Mitglieder müssen dann diesen Migrationen folgen und ihre bei Bedarf platzieren
swdev
1
Sehr guter Punkt, um nur zu laufen migrateund NIEMALS makemigrationsfür festgeschriebene Migrationen. Daran habe ich nie gedacht.
Polarisieren Sie den
9

Zitat aus den Dokumenten von 2018, Django 2.0. (zwei separate Befehle = makemigrationsund migrate)

Der Grund dafür, dass es separate Befehle zum Erstellen und Anwenden von Migrationen gibt, besteht darin, dass Sie Migrationen an Ihr Versionskontrollsystem festschreiben und diese mit Ihrer App versenden. Sie erleichtern nicht nur Ihre Entwicklung, sondern können auch von anderen Entwicklern und in der Produktion verwendet werden.

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

techkuz
quelle
7

TL; DR: Migrationen festschreiben, Migrationskonflikte lösen, Ihren Git-Workflow anpassen.

Sie müssen Ihren Git- Workflow anpassen , anstatt Konflikte zu ignorieren.

Im Idealfall wird jede neue Funktion in einem anderen Zweig entwickelt und mit einer Pull-Anforderung wieder zusammengeführt .

PRs können nicht zusammengeführt werden, wenn ein Konflikt vorliegt. Wer also seine Funktion zusammenführen muss, muss den Konflikt lösen, einschließlich Migrationen. Dies erfordert möglicherweise eine Koordination zwischen verschiedenen Teams.

Es ist jedoch wichtig, Migrationsdateien festzuschreiben! Wenn ein Konflikt auftritt, kann Django Ihnen sogar bei der Lösung dieser Konflikte helfen ;)

Sdra
quelle
Das ist die richtige Antwort. Ein operativer Versionssystem-Workflow scheint in der Django-Dokumentation enthalten zu sein, ist jedoch von grundlegender Bedeutung.
Eric
3

Ich kann mir nicht vorstellen warum Sie Konflikte bekommen würden, wenn Sie die Migrationen nicht irgendwie bearbeiten? Das endet normalerweise schlecht - wenn jemand einige Zwischen-Commits verpasst, wird er nicht von der richtigen Version aktualisiert und seine Kopie der Datenbank wird beschädigt.

Der Prozess, dem ich folge, ist ziemlich einfach: Wenn Sie die Modelle für eine App ändern, schreiben Sie auch eine Migration fest, und diese Migration ändert sich dann nicht. Wenn Sie im Modell etwas anderes benötigen, ändern Sie das Modell und legen eine fest neue Migration neben Ihren Änderungen.

In Greenfield-Projekten können Sie die Migrationen häufig löschen und bei der Veröffentlichung mit einer 0001_-Migration von vorne beginnen. Wenn Sie jedoch über Produktionscode verfügen, können Sie dies nicht (obwohl Sie Migrationen in eine zerquetschen können).

Anthony Briggs
quelle
Toller Punkt, um mit 0001 von vorne zu beginnen.
andho
3

Die normalerweise verwendete Lösung besteht darin, dass der Entwickler alle Remote-Änderungen vornehmen muss, bevor etwas mit dem Master zusammengeführt wird. Wenn es in Migrationsversionen einen Konflikt gibt, sollte er seine lokale Version umbenennen Migration (die Remote-Migration wurde von anderen Entwicklern und möglicherweise in der Produktion ausgeführt) in N + 1 .

Während der Entwicklung ist es möglicherweise in Ordnung, Migrationen einfach nicht festzuschreiben (fügen Sie jedoch keine Ignorierung hinzu, nur nicht add). Sobald Sie jedoch mit der Produktion begonnen haben, benötigen Sie diese, um das Schema mit den Modelländerungen synchron zu halten.

Anschließend müssen Sie die Datei bearbeiten und dependenciesauf die neueste Remote-Version ändern .

Dies funktioniert für Django-Migrationen sowie für andere ähnliche Apps (sqlalchemy + alembic, RoR usw.).

WhyNotHugo
quelle
1

Eine Reihe von Migrationsdateien in Git zu haben, ist chaotisch. Es gibt nur eine Datei im Migrationsordner, die Sie nicht ignorieren sollten. Diese Datei ist eine init .py-Datei. Wenn Sie sie ignorieren, sucht Python nicht mehr nach Submodulen im Verzeichnis, sodass alle Versuche, die Module zu importieren, fehlschlagen. Die Frage sollte also sein, wie alle Migrationsdateien außer init .py ignoriert werden können . Die Lösung lautet: Fügen Sie '.gitignore-Dateien' 0 * .py 'hinzu, und die Aufgabe wird perfekt erledigt.

Hoffe das hilft jemandem.

Gizachew Soboksa
quelle
1

Gitignore die Migrationen, wenn Sie separate DBs für die Entwicklungs-, Staging- und Produktionsumgebung haben. Für Entwickler. Zwecke Sie können die lokale SQLite-Datenbank verwenden und lokal mit Migrationen spielen. Ich würde Ihnen empfehlen, vier zusätzliche Zweige zu erstellen:

  1. Master - Bereinigen Sie frischen Code ohne Migrationen. Niemand ist mit diesem Zweig verbunden. Wird nur für Codeüberprüfungen verwendet

  2. Entwicklung - tägliche Entwicklung. Push / Pull akzeptiert. Jeder Entwickler arbeitet an SQLite DB

  3. Cloud_DEV_env - Remote-Cloud / Server-DEV-Umgebung. Nur ziehen. Behalten Sie Migrationen lokal auf dem Computer bei, der für die Codebereitstellung und Remote-Migrationen der Dev-Datenbank verwendet wird

  4. Cloud_STAG_env - Remote-Cloud / Server-STAG-Umgebung. Nur ziehen. Bewahren Sie Migrationen lokal auf dem Computer auf, der für die Codebereitstellung und Remote-Migrationen der Stag-Datenbank verwendet wird

  5. Cloud_PROD_env - Remote-Cloud / Server-DEV-Umgebung. Nur ziehen. Bewahren Sie Migrationen lokal auf dem Computer auf, der für die Codebereitstellung und Remote-Migrationen der Prod-Datenbank verwendet wird

Anmerkungen: 2, 3, 4 - Migrationen können in Repos aufbewahrt werden, es sollten jedoch strenge Regeln für das Zusammenführen von Pull-Anforderungen gelten. Daher haben wir uns entschlossen, eine Person zu finden, die für die Bereitstellung verantwortlich ist, also den einzigen, der über alle Migrationsdateien verfügt - unsere Bereitstellung -er. Er behält die Remote-DB-Migrationen jedes Mal bei, wenn Änderungen an Modellen vorgenommen werden.

Yevhen Dyachenko
quelle
-3

Kurze Antwort Ich schlage vor, Migrationen im Repo auszuschließen. Nach dem Zusammenführen des Codes einfach ausführen ./manage.py makemigrationsund fertig.

Lange Antwort Ich denke nicht, dass Sie Migrationsdateien in Repo ablegen sollten. Dies wird die Migrationszustände in der Entwicklungsumgebung anderer Personen und in anderen Produkt- und Bühnenumgebungen beeinträchtigen. (Beispiele finden Sie im Kommentar von Sugar Tang).

Meiner Ansicht nach besteht der Zweck von Django-Migrationen darin, Lücken zwischen früheren Modellzuständen und neuen Modellzuständen zu finden und diese Lücke dann zu serialisieren. Wenn sich Ihr Modell nach dem Zusammenführen des Codes ändert, können Sie makemigrationsdie Lücke einfach herausfinden. Warum möchten Sie andere Migrationen manuell und sorgfältig zusammenführen, wenn Sie dies automatisch und fehlerfrei erreichen können? Django Dokumentation sagt,

Sie * (Migrationen) * sind größtenteils automatisch konzipiert

;; Bitte halte es so. Um Migrationen manuell zusammenführen zu können, müssen Sie vollständig verstehen, was andere geändert haben und welche Abhängigkeit von den Änderungen besteht. Das ist viel Aufwand und fehleranfällig. Die Verfolgung der Modelldatei ist also ausreichend.

Es ist ein gutes Thema im Workflow. Ich bin offen für andere Möglichkeiten.

Diansheng
quelle
4
Dies funktioniert nur bei Spielzeugprojekten und hat viele Nachteile. Es funktioniert sofort nicht mehr für handgeschriebene Migrationen, für Dienste, die mehrere kurzlebige App-Server verwenden (dh für jede ernsthafte Anwendung), und für Apps, die aus vielen Django-Apps mit jeweils eigenen Migrationen bestehen. Und ich verstehe nicht, worauf Sie sich mit "Manuelles Zusammenführen von Migrationen" beziehen - manage.py makemigrations --mergefunktioniert bei mir vollautomatisch.
Sven Marnach
@Sven Marnach, ich habe in der Tat an kleinen, aber ernsthaften Anwendungen gearbeitet. Und es funktioniert bei mir.
Diansheng