【问题标题】:Unable to create views in mysql using sequelize ORM无法使用 sequelize ORM 在 mysql 中创建视图
【发布时间】:2018-07-02 14:29:46
【问题描述】:

目前,我正在使用 nodejs + mysql 构建一个 Web 应用程序,并作为 ORM 进行续集。我想像在 mysql 中一样创建一些视图,但在 Sequelize 中找不到任何选项来创建视图。

是否有可以创建视图的 ORM?还是可以用sequelize来做?

【问题讨论】:

标签: mysql node.js orm sequelize.js


【解决方案1】:

在 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 OR 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}`);
  }
}

当然,确切的代码 sn-ps 会根据您迄今为止设置迁移的方式而有所不同。

迁移完成后,像往常一样创建一个代表视图架构的 Sequelize 模型,使用视图名称作为表名称。所有find 系列函数都应该按预期工作,而updatedeletecreate 应该会失败。

您可以参考raw queries 的 Sequelize 文档,以及此 example repo 以将 Umzug 与 Sequelize 结合使用。我能找到的关于 Umzug 本身的唯一正式文档是它的 NPM page

【讨论】:

  • 很好的答案!对于使用 sequelize-cli 生成迁移的其他任何人,您会注意到 up/down 函数中的 database 参数显示为 queryInterface - 您不能只使用 queryInterface.query,因为它无效 - 到获取要运行原始查询的对象,您需要:queryInterface.sequelize.query
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2018-10-08
  • 2021-06-24
相关资源
最近更新 更多