我在我的数据库(mysql)中使用表和视图,因此对于dev / test环境,我想使用sync(),但它在视图上崩溃。
我可以以某种方式省略这些模型吗?
答案 0 :(得分:5)
当我想创建和使用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:[]
表示法将其他表添加到视图查询中。
答案 1 :(得分:2)
您无法通过在主要续集中使用同步来跳过模型,
但您可以使用模型同步功能,只在想要同步的模型上调用同步功能
http://docs.sequelizejs.com/en/latest/api/model/#sync-promisethis
答案 2 :(得分:1)
我刚刚做了:
const MyView = sequelize.define('myView', {
ids: {
type: DataTypes.ARRAY(DataTypes.INTEGER)
},
volumeSum: {
type: DataTypes.INTEGER
}
});
// To avoid table creation
MyView.sync = () => Promise.resolve();
然后sequelize.sync();
没有为视图创建表。
希望对您有帮助...
答案 3 :(得分:0)
好的,正如告诉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);
});
}