无法使用sequelize ORM在mysql中创建视图

时间:2018-01-23 17:13:17

标签: mysql node.js orm sequelize.js

目前我正在构建一个带有nodejs + mysql和sequelize作为ORM的web应用程序,我想像在mysql中一样创建一些视图,但我无法在 Sequelize 中找到任何选项来创建视图。

是否有可能创建视图的ORM?还是可以用续集?

2 个答案:

答案 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系列功能都应按预期工作,而updatedeletecreate应该会失败。

您可以参考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
            });
        });

注意:由于视图不支持创建,更新,删除操作

,我们只能仅执行读取操作