Ich bin kurz davor, mein Projekt startbereit zu machen. Ich habe große Pläne für nach dem Start und die Datenbankstruktur wird sich ändern - neue Spalten in vorhandenen Tabellen sowie neue Tabellen und neue Zuordnungen zu vorhandenen und neuen Modellen.
Ich habe Migrationen in Sequelize noch nicht berührt, da ich nur Testdaten hatte, die ich gerne jedes Mal lösche, wenn sich die Datenbank ändert.
Zu diesem Zweck werde ich derzeit beim Start sync force: true
meiner App ausgeführt, wenn ich die Modelldefinitionen geändert habe. Dadurch werden alle Tabellen gelöscht und von Grund auf neu erstellt. Ich könnte die force
Option weglassen , nur neue Tabellen erstellen zu lassen. Wenn sich jedoch vorhandene geändert haben, ist dies nicht sinnvoll.
Wie funktionieren die Dinge, wenn ich Migrationen hinzufüge? Natürlich möchte ich nicht, dass vorhandene Tabellen (mit Daten darin) gelöscht werden, daher sync force: true
kommt dies nicht in Frage. Bei anderen Apps, an deren Entwicklung ich mitgewirkt habe (Laravel und andere Frameworks), führen wir im Rahmen des Bereitstellungsverfahrens der App den Befehl migrate aus, um ausstehende Migrationen auszuführen. In diesen Apps verfügt die allererste Migration jedoch über eine Skelettdatenbank, wobei sich die Datenbank in dem Zustand befindet, in dem sie sich einige Zeit zu Beginn der Entwicklung befand - die erste Alpha-Version oder was auch immer. So kann auch eine Instanz der App, die zu spät zur Party kommt, auf einmal auf den neuesten Stand gebracht werden, indem alle Migrationen nacheinander ausgeführt werden.
Wie generiere ich eine solche "erste Migration" in Sequelize? Wenn ich keine habe, hat eine neue Instanz der App in der Zukunft entweder keine Skelettdatenbank, auf der die Migrationen ausgeführt werden können, oder sie wird zu Beginn synchronisiert und die Datenbank mit allen in den neuen Status versetzt die neuen Tabellen usw., aber wenn dann versucht wird, die Migrationen auszuführen, sind sie nicht sinnvoll, da sie mit der ursprünglichen Datenbank und jeder nachfolgenden Iteration geschrieben wurden.
Mein Denkprozess: In jeder Phase sollte die anfängliche Datenbank plus jede Migration nacheinander gleich (plus oder minus Daten) der Datenbank sein, die wann generiert wurde sync force: true
es läuft. Dies liegt daran, dass die Modellbeschreibungen im Code die Datenbankstruktur beschreiben. Wenn es also keine Migrationstabelle gibt, führen wir einfach die Synchronisierung aus und markieren alle Migrationen als abgeschlossen, obwohl sie nicht ausgeführt wurden. Muss ich das tun (wie?) Oder soll Sequelize das selbst tun oder belle ich den falschen Baum an? Und wenn ich mich im richtigen Bereich befinde, sollte es angesichts der alten Modelle (durch Commit-Hash? Oder könnte jede Migration an ein Commit gebunden sein?) Sicherlich eine gute Möglichkeit geben, den größten Teil einer Migration automatisch zu generieren. Ich gebe zu, dass ich denke in einem nicht tragbaren git-zentrierten Universum) und den neuen Modellen. Es kann die Struktur unterscheiden und die Befehle generieren, die zum Transformieren der Datenbank von alt zu neu und zurück erforderlich sind. Anschließend kann der Entwickler die erforderlichen Änderungen vornehmen (Löschen / Übertragen bestimmter Daten usw.).
Wenn ich die Sequelize-Binärdatei mit dem --init
Befehl ausführe , wird mir ein leeres Migrationsverzeichnis angezeigt . Wenn ich es dann ausführe sequelize --migrate
, erhalte ich eine SequelizeMeta-Tabelle mit nichts darin, keinen anderen Tabellen. Offensichtlich nicht, da diese Binärdatei nicht weiß, wie ich meine App booten und die Modelle laden kann.
Mir muss etwas fehlen.
TLDR: Wie richte ich meine App und ihre Migrationen ein, damit verschiedene Instanzen der Live-App auf den neuesten Stand gebracht werden können, sowie eine brandneue App ohne alte Startdatenbank?
sync
, besteht die Idee darin, dass Migrationen die gesamte Datenbank "generieren", sodass es an sich schon ein Problem ist, sich auf ein Skelett zu verlassen. Der Ruby on Rails-Workflow verwendet beispielsweise Migrationen für alles und ist ziemlich beeindruckend, wenn Sie sich erst einmal daran gewöhnt haben. Bearbeiten: Und ja, ich habe bemerkt, dass diese Frage ziemlich alt ist, aber da es nie eine zufriedenstellende Antwort gab und die Leute hierher kommen könnten, um Rat zu suchen, dachte ich, ich sollte dazu beitragen.