Sequelizeモデルのセットがあります。 DB Syncではなく、移行を使用したい。
Sequelize CLI は、これを行うことができるようです この記事 :「 」
既存のSequelizeモデルからSequelize CLIを使用して移行を自動生成する方法は?
既存のモデルの移行スクリプトを作成することはできません。
リソース:
従来の方法を使用する場合は、CLIを使用してモデルを再作成する必要があります。
sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text
これらのファイルが生成されます:
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);
}
};
モデルをゼロから再作成したくない場合は、次のCLIコマンドを使用して移行ファイルを手動で生成できます。
sequelize migration:generate --name [name_of_your_migration]
これにより、空のスケルトン移行ファイルが生成されます。モデル構造をファイルにコピーするわけではありませんが、すべてを再生成するよりも簡単でわかりやすいと思います。注:必ず、移行ディレクトリの格納ディレクトリからコマンドを実行してください。そうでない場合、CLIは新しい移行ディレクトリを生成します
Npmパッケージsequelize-auto-migrationsを使用して、移行ファイルを自動的に生成できるようになりました。 https://www.npmjs.com/package/sequelize-auto-migrations
Sequelize-cliを使用して、プロジェクトを初期化します
sequelize init
モデルを作成し、モデルフォルダーに配置します。
Sequelize-auto-migrationsをインストールします。
npm install sequelize-auto-migrations
で初期移行ファイルを作成します
node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>
移行を実行します。
node ./node_modules/sequelize-auto-migrations/bin/runmigration
既存のデータベースからモデルを自動的に生成することもできますが、それは問題の範囲を超えています。
小さな作業用の「移行ファイルジェネレータ」を作成しました。 sequelize db:migrate
を使用して、完全に正常に機能するファイルを作成します-外部キーを使用しても!
ここで見つけることができます: https://Gist.github.com/manuelbieh/ae3b028286db10770c81
以下をカバーする12の異なるモデルを持つアプリケーションでテストしました。
DataTypeとしてのSTRING、TEXT、ENUM、INTEGER、BOOLEAN、FLOAT
外部キーの制約(相互(ユーザーに所属するチーム、所有者として所属するチーム)も)
name
、method
、およびunique
プロパティを持つインデックス
自動生成はされませんが、モデルの変更時に新しい移行を生成する1つの方法は次のとおりです(移行とモデルが同じレベルにあるストックsequelize-cliファイル構造を使用していると仮定します)。
(Manuel Biehの提案と同じですが、インポートの代わりにrequireを使用します)移行ファイル(ない場合は、「sequelize migration:create
」を実行して生成できます)には次のコードがあります。
'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');
}
};
ユーザーモデルに変更を加えます。
sequelize db:migrate:undo:all
sequelize db:migrate
私は最近、うまくいくと思われる次のアプローチを試しましたが、副作用があるかどうかは100%わかりません:
'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) {
...
}
};
sequelize db:migrate
を使用して上記の移行を実行すると、コンソールに次のように表示されます。
Starting 'db:migrate'...
Finished 'db:migrate' after 91 ms
== 20160113121833-create-tables: migrating =======
== 20160113121833-create-tables: migrated (0.518s)
すべてのテーブルがそこにあり、すべてが(少なくともそうであるように)期待どおりに動作します。正しく定義されていれば、すべての関連付けも存在します。