目前我正在构建一个带有nodejs + mysql和sequelize作为ORM的web应用程序,我想像在mysql中一样创建一些视图,但我无法在 Sequelize 中找到任何选项来创建视图。
是否有可能创建视图的ORM?还是可以用续集?
答案 0 :(得分:4)
Sequelize中没有用于管理视图的内置方法,但是您可以使用简单的SQL查询创建它们,并使用普通的Sequelize模型对其进行管理。
如果您按照Sequelize文档的建议使用Umzug进行迁移,则可以使用类似于以下内容的迁移来创建视图:
const view_name = 'my_view';
const query = '<SQL QUERY THAT RETURNS YOUR VIEW>';
module.exports = {
up: function (database, Sequelize) {
return database.query(`CREATE VIEW ${view_name} AS ${query}`);
},
down: function (database, Sequelize) {
return database.query(`DROP VIEW ${view_name}`);
}
}
对于视图更改或更新,应使用CREATE或REPLACE VIEW语法来确保可以回滚架构更改-避免尝试丢弃旧视图并创建新视图!
const view_name = 'my_view';
const original_query = '<SQL QUERY THAT RETURNS YOUR VIEW>';
const new_query = '<SQL QUERY THAT RETURNS YOUR UPDATED VIEW>';
module.exports = {
up: function (database, Sequelize) {
return database.query(`CREATE OR REPLACE VIEW ${view_name} AS ${new_query}`);
},
down: function (database, Sequelize) {
return database.query(`CREATE OR REPLACE VIEW ${view_name} AS ${original_query}`);
}
}
当然,确切的代码片段会根据您到目前为止设置迁移的方式而有所不同。
迁移完成后,使用视图名称作为表名称,照常创建一个表示视图架构的Sequelize模型。所有find
系列功能都应按预期工作,而update
,delete
和create
应该会失败。
您可以参考raw queries的Sequelize文档,以及本example repo的参考,以将Umzug与Sequelize一起使用。我能找到有关Umzug本身的唯一正式文档是在其NPM page上。
答案 1 :(得分:0)
数据库视图不过是定义中具有SQL查询的虚拟表,因此无法在视图上执行创建,更新,删除操作,我的意思是我们只能在视图上执行读取操作。
使用数据库视图与在sequelize中使用表相同,但请确保设置 freezeTableName:true 以禁止修改表名和 timestamps:false ,以避免添加时间戳属性(updatedAt,createdAt)
例如:我已经创建了一个数据库视图 vw_employee_name 并创建了
之类的续集模型 module.exports = (sequelize, DataTypes) => {
const Employee = sequelize.define('vw_employee_name', {
id: {
type: DataTypes.INTEGER,
primaryKey: true
},
name: DataTypes.STRING
},
{
freezeTableName: true,
timestamps: false,
});
return Employee;
}
现在我们可以简单地使用sequelize findAll方法读取vw_employee_name数据 像
var Employee = app.models.Employee;
Employee.findAll().then(function (employees) {
return res.status(responseStatus.SUCCESS).send({
employee: employees,
status: true
});
}).catch(function (error) {
return res.status(responseStatus.INTERNAL_ERROR).send({
message: 'INTERNAL SERVER ERROR',
error: error
});
});
注意:由于视图不支持创建,更新,删除操作
,我们只能仅执行读取操作