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.
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.gitignore
die Migrationsdatei. Wir wissen immer noch nicht, wie wir es lösen sollen, wenn das System in Produktion geht. Hat jemand irgendwelche Lösungen?Sie können dem folgenden Prozess folgen.
Sie können
makemigrations
lokal ausgeführt werden, wodurch die Migrationsdatei erstellt wird. Übernehmen Sie diese neue Migrationsdatei für das Repo.Meiner Meinung nach sollten Sie überhaupt nicht
makemigrations
in Produktion gehen. Sie könnenmigrate
in 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,
Übernehmen Sie nun diese neu erstellten Dateien (siehe unten).
Führen Sie in PRODUCTION ENV nur den folgenden Befehl aus.
quelle
migrate
und NIEMALSmakemigrations
für festgeschriebene Migrationen. Daran habe ich nie gedacht.Zitat aus den Dokumenten von 2018, Django 2.0. (zwei separate Befehle =
makemigrations
undmigrate
)https://docs.djangoproject.com/de/2.0/intro/tutorial02/
quelle
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 ;)
quelle
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).
quelle
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
dependencies
auf die neueste Remote-Version ändern .Dies funktioniert für Django-Migrationen sowie für andere ähnliche Apps (sqlalchemy + alembic, RoR usw.).
quelle
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.
quelle
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:
Master - Bereinigen Sie frischen Code ohne Migrationen. Niemand ist mit diesem Zweig verbunden. Wird nur für Codeüberprüfungen verwendet
Entwicklung - tägliche Entwicklung. Push / Pull akzeptiert. Jeder Entwickler arbeitet an SQLite DB
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
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
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.
quelle
Kurze Antwort Ich schlage vor, Migrationen im Repo auszuschließen. Nach dem Zusammenführen des Codes einfach ausführen
./manage.py makemigrations
und 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
makemigrations
die 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,;; 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.
quelle
manage.py makemigrations --merge
funktioniert bei mir vollautomatisch.