Ich arbeite an einer Rails-App mit einigen Git-Zweigen, von denen viele DB-Migrationen enthalten. Wir versuchen vorsichtig zu sein, aber gelegentlich fragt ein Teil des Codes im Master nach einer Spalte, die in einem anderen Zweig entfernt / umbenannt wurde.
Was wäre eine gute Lösung, um Git-Zweige mit DB-Zuständen zu "koppeln"?
Was wären diese "Staaten" eigentlich?
Wir können eine Datenbank nicht einfach duplizieren, wenn sie einige GB groß ist.
Und was soll mit Zusammenführungen passieren?
Würde die Lösung auch in noSQL-Datenbanken übersetzt?
Wir verwenden derzeit MySQL, Mongodb und Redis
EDIT: Sieht so aus, als hätte ich vergessen, einen sehr wichtigen Punkt zu erwähnen. Ich interessiere mich nur für die Entwicklungsumgebung, aber für große Datenbanken (einige GB groß).
quelle
Antworten:
Wenn Sie in einem Zweig eine neue Migration hinzufügen, führen Sie
rake db:migrate
die Migration und ausdb/schema.rb
Wenn Sie dies tun, können Sie in der Entwicklung zu einem anderen Zweig mit anderen Migrationen wechseln und einfach ausführen
rake db:schema:load
.Beachten Sie, dass dadurch die gesamte Datenbank neu erstellt wird und vorhandene Daten verloren gehen .
Sie möchten wahrscheinlich nur die Produktion von einem Zweig aus ausführen, mit dem Sie sehr vorsichtig sind, daher gelten diese Schritte dort nicht (nur dort
rake db:migrate
wie gewohnt ausführen ). In der Entwicklung sollte es jedoch keine große Sache sein, die Datenbank aus dem Schema neu zu erstellenrake db:schema:load
.quelle
db/seeds.rb
Sie Es sollte nicht zu verheerend sein, Ihre Entwicklungsdatenbank zu zerstören, wenn Sie dort einige vernünftige Startdaten einrichten.db/seeds.rb
Sie, die verlorenen Datenbankdaten für die Ripopulation zu verwendenWenn Sie eine große Datenbank haben, die Sie nicht ohne weiteres reproduzieren können, würde ich die Verwendung der normalen Migrationstools empfehlen. Wenn Sie einen einfachen Prozess wünschen, würde ich Folgendes empfehlen:
rake db:rollback
) vor dem Verzweigen in den Zustand vor dem Verzweigungspunkt. Führen Sie dann nach dem Wechseln der Zweige ausdb:migrate
. Dies ist mathematisch korrekt und solange Siedown
Skripte schreiben , funktioniert es.quelle
rake db:schema:load
undrake db:seed
wie @noodl gesagt hatte.Hier ist ein Skript, das ich zum Wechseln zwischen Zweigen mit unterschiedlichen Migrationen geschrieben habe:
https://gist.github.com/4076864
Es werden nicht alle von Ihnen erwähnten Probleme gelöst, aber mit einem Zweigstellennamen wird es:
Ich mache das die ganze Zeit manuell in unserem Projekt, daher dachte ich, es wäre schön, den Prozess zu automatisieren.
quelle
git checkout db/schema.rb
oder meinten Siegit checkout -- db/schema.rb
? (dh mit doppelten Strichen)db/schema.rb
. :)Separate Datenbank für jeden Zweig
Es ist der einzige Weg zu fliegen.
Update 16. Oktober 2017
Ich bin nach einiger Zeit darauf zurückgekommen und habe einige Verbesserungen vorgenommen:
bundle exec rake git:branch
.db:clone_from_branch
Aufgabe eineSOURCE_BRANCH
und eineTARGET_BRANCH
Umgebungsvariable enthält. Bei Verwendunggit:branch
wird automatisch der aktuelle Zweig als verwendetSOURCE_BRANCH
.config/database.yml
Um es Ihnen einfacher zu machen, aktualisieren Sie Ihre
database.yml
Datei wie folgt, um den Datenbanknamen basierend auf dem aktuellen Zweig dynamisch zu ermitteln.lib/tasks/db.rake
Hier ist eine Rake-Aufgabe, mit der Sie Ihre Datenbank einfach von einem Zweig in einen anderen klonen können. Dies erfordert eine
SOURCE_BRANCH
und eineTARGET_BRANCH
Umgebungsvariable. Basierend auf der Aufgabe von @spalladino .lib/tasks/git.rake
Diese Aufgabe erstellt einen Git-Zweig aus dem aktuellen Zweig (Master oder auf andere Weise), checkt ihn aus und klont die Datenbank des aktuellen Zweigs in die Datenbank des neuen Zweigs. Es ist glatter AF.
Jetzt müssen Sie nur noch rennen
bundle exec git:branch
, den neuen Filialnamen eingeben und Zombies töten.quelle
Vielleicht sollten Sie dies als Hinweis darauf nehmen, dass Ihre Entwicklungsdatenbank zu groß ist? Wenn Sie db / seeds.rb und einen kleineren Datensatz für die Entwicklung verwenden können, kann Ihr Problem mithilfe von schema.rb und seeds.rb aus dem aktuellen Zweig leicht gelöst werden.
Dies setzt voraus, dass sich Ihre Frage auf die Entwicklung bezieht. Ich kann mir nicht vorstellen, warum Sie regelmäßig die Filialen in der Produktion wechseln müssten.
quelle
db/seeds.rb
, ich werde es mir ansehen.Ich hatte mit dem gleichen Problem zu kämpfen. Hier ist meine Lösung:
Stellen Sie sicher, dass sowohl schema.rb als auch alle Migrationen von allen Entwicklern eingecheckt werden.
Es sollte eine Person / Maschine für die Bereitstellung in der Produktion vorhanden sein. Nennen wir diese Maschine die Merge-Maschine. Wenn die Änderungen auf den Zusammenführungscomputer übertragen werden, schlägt die automatische Zusammenführung für schema.rb fehl. Keine Probleme. Ersetzen Sie einfach den Inhalt durch den vorherigen Inhalt für schema.rb (Sie können eine Kopie beiseite legen oder von github herunterladen, wenn Sie sie verwenden ...).
Hier ist der wichtige Schritt. Die Migrationen aller Entwickler sind jetzt im Ordner db / migrate verfügbar. Fahren Sie fort und führen Sie bundle exec rake db: migrate aus. Dadurch wird die Datenbank auf dem Zusammenführungscomputer mit allen Änderungen gleichgesetzt. Außerdem wird schema.rb neu generiert.
Übernehmen Sie die Änderungen und übertragen Sie sie auf alle Repositorys (Fernbedienungen und Einzelpersonen, die ebenfalls Fernbedienungen sind). Du solltest fertig sein!
quelle
Dies ist, was ich getan habe und ich bin nicht ganz sicher, ob ich alle Grundlagen abgedeckt habe:
In der Entwicklung (mit postgresql):
Dies ist viel schneller als die Rake-Dienstprogramme in einer Datenbank mit etwa 50.000 Datensätzen.
Behalten Sie für die Produktion den Hauptzweig als sakrosankt bei, und alle Migrationen werden eingecheckt und shema.rb ordnungsgemäß zusammengeführt. Führen Sie Ihr Standard-Upgrade-Verfahren durch.
quelle
Sie möchten eine "Datenbankumgebung" pro Zweig beibehalten. Schauen Sie sich das Skript smudge / clean an, um auf verschiedene Instanzen zu verweisen. Wenn Ihnen die Datenbankinstanzen ausgehen, lassen Sie das Skript von einer temporären Instanz herunterfahren. Wenn Sie also zu einem neuen Zweig wechseln, ist dieser bereits vorhanden und muss nur vom Skript umbenannt werden. DB-Updates sollten unmittelbar vor der Ausführung Ihrer Tests ausgeführt werden.
Hoffe das hilft.
quelle
Ich erlebe die Pita, die du hier hast. Wenn ich darüber nachdenke, ist das eigentliche Problem, dass nicht alle Zweige den Code haben, um bestimmte Zweige zurückzusetzen. Ich bin in der Django-Welt, also weiß ich nicht, wie gut ich harke. Ich spiele mit der Idee, dass die Migrationen in einem eigenen Repo leben, das nicht verzweigt wird (Git-Submodul, von dem ich kürzlich erfahren habe). Auf diese Weise haben alle Zweige alle Migrationen. Der klebrige Teil stellt sicher, dass jeder Zweig nur auf die Migrationen beschränkt ist, die ihn interessieren. Dies manuell zu tun / zu verfolgen wäre eine Pita und fehleranfällig. Keines der Migrationstools ist dafür ausgelegt. Das ist der Punkt, an dem ich keinen Weg nach vorne habe.
quelle
Ich würde eine von zwei Optionen vorschlagen:
Option 1
seeds.rb
. Eine gute Möglichkeit ist, Ihre Saatgutdaten über FactoryGirl / Fabrication Gem zu erstellen. Auf diese Weise können Sie sicherstellen, dass die Daten mit dem Code synchron sind, wenn wir davon ausgehen, dass die Fabriken zusammen mit dem Hinzufügen / Entfernen von Spalten aktualisiert werden.rake db:reset
die Datenbank aus, wodurch die Datenbank effektiv gelöscht / erstellt / gesetzt wird.Option 2
Verwalten Sie den Status der Datenbank manuell, indem Sie immer
rake db:rollback
/rake db:migrate
vor / nach einer Verzweigungsprüfung ausführen. Die Einschränkung ist, dass alle Ihre Migrationen reversibel sein müssen, sonst funktioniert dies nicht.quelle
Zur Entwicklungsumgebung:
Sie sollten mit arbeiten, um
rake db:migrate:redo
zu testen, ob Ihr Skript reversibel ist, aber denken Sie daran, dass Sie immer eine Datenpopulation haben solltenseed.rb
.Wenn Sie mit git arbeiten, sollte Ihre seed.rb mit einer Migrationsänderung und der Ausführung von geändert werden
db:migrate:redo
Anfang an (Laden Sie die Daten für eine neue Entwicklung auf einen anderen Computer oder eine neue Datenbank).Abgesehen von "Ändern" sind Ihre Codes mit Ihren Auf- und Ab-Methoden immer Deckungsszenarien für die "Änderung" in diesem Moment und wenn Sie bei Null beginnen.
quelle