当我想通过 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
}
Where throwNotAllowedError
是一个简单的函数
function throwNotAllowedError() {
throw new Error("Operation not allowed on a view");
}
希望有帮助。获取 Sequelize 的意见使我们的项目生产力大幅提高。
您仍然可以从视图中创建关系和关联,从而允许您使用include:[]
将附加表带入视图查询的表示法。