Es ist 2020 und viele dieser Antworten gelten nicht mehr für das Sequelize v4 / v5 / v6-Ökosystem.
Die eine gute Antwort lautet "verwenden" sequelize-auto-migrations
, ist aber wahrscheinlich nicht vorgeschrieben genug, um sie in Ihrem Projekt zu verwenden. Also hier ist ein bisschen mehr Farbe ...
Installieren
Mein Team verwendet eine Gabelung,sequelize-auto-migrations
da das ursprüngliche Repo nicht mit einigen kritischen PRs zusammengeführt wurde. # 56 # 57 # 58 # 59
$ yarn add github:scimonster/sequelize-auto-migrations#a063aa6535a3f580623581bf866cef2d609531ba
Bearbeiten package.json:
"scripts": {
...
"db:makemigrations": "./node_modules/sequelize-auto-migrations/bin/makemigration.js",
...
}
Prozess
Hinweis: Stellen Sie sicher, dass Sie Git (oder eine Quellcodeverwaltung) und Datenbanksicherungen verwenden, damit Sie diese Änderungen rückgängig machen können, wenn etwas wirklich schief geht.
- Löschen Sie alle alten Migrationen, falls vorhanden.
- Ausschalten
.sync()
- Erstellen Sie eine Mega-Migration, die alles in Ihren aktuellen Modellen migriert (
yarn db:makemigrations --name "mega-migration"
).
- Übernehmen Sie Ihr
01-mega-migration.js
und das _current.json
, was generiert wird.
- Wenn Sie zuvor
.sync()
Migrationen ausgeführt oder handgeschrieben haben, müssen Sie diese Mega-Migration „fälschen“, indem Sie den Namen in Ihre SequelizeMeta-Tabelle einfügen. INSERT INTO SequelizeMeta Values ('01-mega-migration.js')
.
- Jetzt sollten Sie dies wie gewohnt verwenden können ...
- Nehmen Sie Änderungen an Ihren Modellen vor (Spalten hinzufügen / entfernen, Einschränkungen ändern)
- Lauf
$ yarn db:makemigrations --name whatever
- Übernehmen Sie Ihre
02-whatever.js
Migration und die Änderungen an _current.json
und _current.bak.json
.
- Führen Sie Ihre Migration über das normale sequelize-cli aus :
$ yarn sequelize db:migrate
.
- Wiederholen Sie 7-10 nach Bedarf
Bekannte Fallstricke
- Das Umbenennen einer Spalte wird zu einem Paar von
removeColumn
und addColumn
. Dadurch gehen Daten in der Produktion verloren. Sie müssen die Aufwärts- und Abwärtsaktionen ändern, um sie renameColumn
stattdessen zu verwenden .
Für diejenigen, die die Verwendung verwirrt haben renameColumn
, würde das Snippet so aussehen. (Schalter "Spaltenname_vor" und "Spaltenname_nach" für rollbackCommands
)
{
fn: "renameColumn",
params: [
"table_name",
"column_name_before",
"column_name_after",
{
transaction: transaction
}
]
}
Wenn Sie viele Migrationen haben, werden durch die Abwärtsaktion Elemente möglicherweise nicht perfekt in einer auftragskonsistenten Weise entfernt.
Der Betreuer dieser Bibliothek überprüft sie nicht aktiv. Wenn es für Sie nicht sofort funktioniert, müssen Sie eine andere Community-Gabel oder eine andere Lösung finden.