Cru*_*der 1 mysql database node.js sequelize.js
我在数据库(mysql)中使用表和视图,因此对于开发/测试环境,我想使用sync(),但是在视图上崩溃。
我可以以某种方式忽略这些模型吗?
当我想使用Sequelize创建和使用Views时,我使用的方法与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 ...;");
}
});
Run Code Online (Sandbox Code Playgroud)
现在,我有了该设置,我需要确保在创建数据库时不包含视图,并且需要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);
});
});
Run Code Online (Sandbox Code Playgroud)
另外,为了安全起见,我添加了挂钩,以防止在视图上使用任何创建/更新/删除操作。
hooks: {
beforeBulkCreate: throwNotAllowedError,
beforeBulkDestroy: throwNotAllowedError,
beforeBulkUpdate: throwNotAllowedError,
beforeCreate: throwNotAllowedError,
beforeDestroy: throwNotAllowedError,
beforeUpdate: throwNotAllowedError
}
Run Code Online (Sandbox Code Playgroud)
throwNotAllowedError一个简单的函数在哪里
function throwNotAllowedError() {
throw new Error("Operation not allowed on a view");
}
Run Code Online (Sandbox Code Playgroud)
希望能有所帮助。深入了解Sequelize,使我们在该项目上的生产力大大降低。
而且,您仍然可以从视图中创建关系和关联,从而允许您使用include:[]表示法将其他表引入视图查询中。
我已经做了 :
const MyView = sequelize.define('myView', {
ids: {
type: DataTypes.ARRAY(DataTypes.INTEGER)
},
volumeSum: {
type: DataTypes.INTEGER
}
});
// To avoid table creation
MyView.sync = () => Promise.resolve();
Run Code Online (Sandbox Code Playgroud)
然后sequelize.sync();没有为视图创建表。我希望,它有帮助...
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |