DB(mysql)でテーブルとビューを使用するので、dev/test環境ではsync()を使用したいが、ビューはクラッシュする。sequelize.sync()を作成するにはいくつかのモデルを省略しますか?
これらのモデルをどうにか省略することはできますか?言われて
DB(mysql)でテーブルとビューを使用するので、dev/test環境ではsync()を使用したいが、ビューはクラッシュする。sequelize.sync()を作成するにはいくつかのモデルを省略しますか?
これらのモデルをどうにか省略することはできますか?言われて
、あなたは、メインsequelizeに同期を使用して
をモデルをスキップすることはできませんが、代わりにあなたは、モデルの同期機能を使用することができますし、あなただけは
http://docs.sequelizejs.com/en/latest/api/model/#sync-promisethis
[OK]を同期したいモデルに同期関数を呼び出しますKevalは私がモデルに)(同期する必要があるので、私はsequelize.sync(から/貼り付けコード)をコピーし、それを変更:
if (config.sync && config.sync != 'false') {
let models = [];
sequelize.modelManager.forEachModel(function(model) {
if (model && model.options.sync !== false) {
models.push(model);
} else {
// DB should throw an SQL error if referencing inexistant table
}
});
return Sequelize.Promise.each(models, function(model) {
return model.sync(config.sync);
});
}
を私はかなりのSIMメソッドを使用しますViewsをSequelizeで作成して使用したいときのCrusaderの答えと同じです。このケースでは、Sequelizeでテーブルを作成するときにビューを同期させたくない場合があります。私はSequelizeモデルに以下を追加します。これを行うには:
var MyView = sequelize.define("MyView", {
status: { type: DataTypes.TEXT },
},
{
doNotSync: true,
tableName: "myDatabaseView", // The actual view name in database
classMethods: {
createView: function(models) {
return sequelize.query("CREATE OR REPLACE VIEW myDatabaseView ...;");
}
});
今、私は、データベースを作成するときにビューが含まれていないことを確認する必要があり、そのセットアップを持っているとcreateView
方法は、それぞれに呼ばれていること再生回数
var tables = [];
sequelize.modelManager.forEachModel(m => {
if (m.options.doNotSync !== true) {
tables.push(m);
}
});
return Sequelize.Promise.each(tables, t => {
return t.sync({force: true});
}).then(_ => {
var views = [];
sequelize.modelManager.forEachModel(m => {
if (m.options.doNotSync && m.createView) {
views.push(m);
}
});
return Sequelize.Promise.each(views, v => {
return v.createView(sequelize.models);
});
});
また、安全な側にあるために、ビューの作成/更新/削除操作の使用を防ぐためにフックを追加します。
hooks: {
beforeBulkCreate: throwNotAllowedError,
beforeBulkDestroy: throwNotAllowedError,
beforeBulkUpdate: throwNotAllowedError,
beforeCreate: throwNotAllowedError,
beforeDestroy: throwNotAllowedError,
beforeUpdate: throwNotAllowedError
}
どこthrowNotAllowedError
が
function throwNotAllowedError() {
throw new Error("Operation not allowed on a view");
}
お役に立てば幸いです。 Sequelizeのビューを取得することで、プロジェクトの生産性が大幅に向上しました。
ビューからリレーションシップとアソシエーションを作成して、include:[]
表記を使用してビューのクエリに追加の表を表示することができます。