Ich habe eine Reihe von Sequelize-Modellen. Ich möchte Migrationen verwenden, nicht DB Sync.
Sequelize CLI scheint dazu in der Lage zu sein, laut diesem Artikel : "Wenn Sie die CLI für die Modellgenerierung verwenden, erhalten Sie die Migrationsskripte ebenfalls kostenlos."
Wie werden die Migrationen mit Sequelize CLI aus vorhandenen Sequelize-Modellen automatisch generiert?
mysql
node.js
orm
sequelize.js
Michael Schmidt
quelle
quelle
Antworten:
Wenn Sie Ihr Modell nicht von Grund auf neu erstellen möchten, können Sie mithilfe des folgenden CLI-Befehls manuell eine Migrationsdatei erstellen:
sequelize migration:generate --name [name_of_your_migration]
Dadurch wird eine leere Skelettmigrationsdatei generiert. Obwohl es Ihre Modellstruktur nicht in die Datei kopiert, finde ich es einfacher und sauberer als alles neu zu generieren. Hinweis: Stellen Sie sicher, dass Sie den Befehl aus dem enthaltenen Verzeichnis Ihres Migrationsverzeichnisses ausführen. Andernfalls generiert die CLI ein neues Migrationsverzeichnis für Sie
quelle
npx sequelize-cli migration:generate --name [name_of_your_migration]
vom Stammverzeichnis Ihres Projekts aus ausführen . Bevor Sie dies tun, müssen Sie sequelize-cli mitteilen, wo Ihre Migrationen generiert werden sollen. Sequelize-cli verwendet die dafür aufgerufene Konfigurationmigrations-path
. sequelize.org/master/manual/…Sie können keine Migrationsskripte für vorhandene Modelle erstellen.
Ressourcen:
Wenn Sie den klassischen Weg gehen, müssen Sie die Modelle über die CLI neu erstellen:
sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text
Es werden diese Dateien generiert:
models / myuser.js:
"use strict"; module.exports = function(sequelize, DataTypes) { var MyUser = sequelize.define("MyUser", { first_name: DataTypes.STRING, last_name: DataTypes.STRING, bio: DataTypes.TEXT }, { classMethods: { associate: function(models) { // associations can be defined here } } }); return MyUser; };
migrations / 20150210104840-create-my-user.js:
"use strict"; module.exports = { up: function(migration, DataTypes, done) { migration.createTable("MyUsers", { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: DataTypes.INTEGER }, first_name: { type: DataTypes.STRING }, last_name: { type: DataTypes.STRING }, bio: { type: DataTypes.TEXT }, createdAt: { allowNull: false, type: DataTypes.DATE }, updatedAt: { allowNull: false, type: DataTypes.DATE } }).done(done); }, down: function(migration, DataTypes, done) { migration.dropTable("MyUsers").done(done); } };
quelle
stukko addMigration
nach 5:40 tippte ).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.
.sync()
yarn db:makemigrations --name "mega-migration"
).01-mega-migration.js
und das_current.json
, was generiert wird..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')
.$ yarn db:makemigrations --name whatever
02-whatever.js
Migration und die Änderungen an_current.json
und_current.bak.json
.$ yarn sequelize db:migrate
.Bekannte Fallstricke
removeColumn
undaddColumn
. Dadurch gehen Daten in der Produktion verloren. Sie müssen die Aufwärts- und Abwärtsaktionen ändern, um sierenameColumn
stattdessen zu verwenden .{ 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.
quelle
--name
Option dann einfach nicht . Es ist optional. Es wird dann erstellt01-noname.js
... und Sie können diese Datei manuell umbenennen.Sie können jetzt das npm-Paket sequelize-auto-migrations verwenden, um automatisch eine Migrationsdatei zu generieren. https://www.npmjs.com/package/sequelize-auto-migrations
Initialisieren Sie Ihr Projekt mit sequelize-cli mit
sequelize init
Erstellen Sie Ihre Modelle und legen Sie sie in Ihrem Modellordner ab.
Installieren Sie sequelize-auto-migrations:
npm install sequelize-auto-migrations
Erstellen Sie eine erste Migrationsdatei mit
node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>
Führen Sie Ihre Migration aus:
node ./node_modules/sequelize-auto-migrations/bin/runmigration
Sie können Ihre Modelle auch automatisch aus einer vorhandenen Datenbank generieren, was jedoch den Rahmen der Frage sprengt.
quelle
Ich habe einen kleinen funktionierenden "Migrationsdateigenerator" erstellt. Es werden Dateien erstellt, die mit
sequelize db:migrate
- auch mit Fremdschlüsseln - einwandfrei funktionieren !Sie finden es hier: https://gist.github.com/manuelbieh/ae3b028286db10770c81
Ich habe es in einer Anwendung mit 12 verschiedenen Modellen getestet, die Folgendes abdecken:
STRING, TEXT, ENUM, INTEGER, BOOLEAN, FLOAT als Datentypen
Fremdschlüsseleinschränkungen (auch wechselseitig (Benutzer gehört zum Team, Team gehört dem Benutzer als Eigentümer))
Indizes mit
name
,method
undunique
Eigenschaftenquelle
Obwohl es nicht automatisch generiert wird, besteht eine Möglichkeit, neue Migrationen bei einer Änderung an einem Modell zu generieren, darin: (vorausgesetzt, Sie verwenden die Standard-Sequelize-Cli-Dateistruktur, in der sich Migrationen und Modelle auf derselben Ebene befinden)
(Wie der Vorschlag von Manuel Bieh, jedoch mit einem Erfordernis anstelle eines Imports) In Ihrer Migrationsdatei (falls Sie keine haben, können Sie eine mit "
sequelize migration:create
" generieren ) haben Sie den folgenden Code:'use strict'; var models = require("../models/index.js") module.exports = { up: function(queryInterface, Sequelize) { return queryInterface.createTable(models.User.tableName, models.User.attributes); }, down: function(queryInterface, Sequelize) { return queryInterface.dropTable('Users'); } };
Nehmen Sie eine Änderung am Benutzermodell vor.
sequelize db:migrate:undo:all
sequelize db:migrate
quelle
models.sequelize.sync({force: true})
(nur ein bisschen komplexer). Wenn Sie das Modell ändern, können Sie Ihr Schema nicht aktualisieren, da die Migration bereits ausgeführt wird (aus diesem Grund tun Sie diesdb:migrate:undo:all
). Migrationen sollten Ihr DB-Schema versionieren. Es ist ein schönes Beispiel (ich habe nur wenige Befehle gelernt), aber ich würde es nicht verwendenproduction
.Wenn Sie ein Modell zusammen mit der Migration erstellen möchten, verwenden Sie diesen Befehl: -
sequelize model:create --name regions --attributes name:string,status:boolean --underscored
- Unterstrichen wird verwendet, um Spalten mit Unterstrichen zu erstellen, wie z. B.: - created_at, updated_at oder jede andere Spalte mit Unterstrichen und unterstützt benutzerdefinierte Spalten mit Unterstrichen.
quelle
Ab dem 16.9.2020 sind die meisten dieser Antworten in keiner Weise zu konsistent! Probieren Sie dieses neue npm-Paket aus
Es hat die bekanntesten Probleme bei der automatischen Fortsetzung von Migrationen und ihren Gabeln gelöst und wird gewartet und dokumentiert!
Es wird auf ähnliche Weise wie das bekannte verwendet
Installieren:
npm install sequelize-mig -g / yarn global add sequelize-mig
dann benutze es so
sequelize-mig migration:make -n <migration name>
quelle
Ich habe kürzlich den folgenden Ansatz ausprobiert, der anscheinend gut funktioniert, obwohl ich nicht 100% sicher bin, ob es irgendwelche Nebenwirkungen geben könnte:
'use strict'; import * as models from "../../models"; module.exports = { up: function (queryInterface, Sequelize) { return queryInterface.createTable(models.Role.tableName, models.Role.attributes) .then(() => queryInterface.createTable(models.Team.tableName, models.Team.attributes)) .then(() => queryInterface.createTable(models.User.tableName, models.User.attributes)) }, down: function (queryInterface, Sequelize) { ... } };
Wenn Sie die oben genannte Migration mit
sequelize db:migrate
ausführen, sagt meine Konsole:Starting 'db:migrate'... Finished 'db:migrate' after 91 ms == 20160113121833-create-tables: migrating ======= == 20160113121833-create-tables: migrated (0.518s)
Alle Tische sind da, alles (wie es scheint) funktioniert wie erwartet. Sogar alle Assoziationen sind da, wenn sie richtig definiert sind.
quelle
./tmp
Ordner) zu generieren : gist.github.com/manuelbieh/606710b003b5fe448100 - wie oben bereits erwähnt: Ich habe keine Ahnung, ob es negative Nebenwirkungen gibt. Verwenden Sie es daher mit Vorsicht!Eine andere Lösung besteht darin, die Datendefinition in einer separaten Datei abzulegen.
Die Idee ist, Daten, die sowohl für das Modell als auch für die Migration gemeinsam sind, in eine separate Datei zu schreiben und sie dann sowohl für die Migration als auch für das Modell zu benötigen. Dann können wir im Modell Validierungen hinzufügen, während die Migration bereits abgeschlossen ist.
Um diesen Beitrag nicht mit tonnenweise Code zu überladen, habe ich einen GitHub-Inhalt geschrieben.
Sehen Sie es hier: https://gist.github.com/igorvolnyi/f7989fc64006941a7d7a1a9d5e61be47
quelle