使用 SequelizeJS 和 CLI 进行迁移

Posted

技术标签:

【中文标题】使用 SequelizeJS 和 CLI 进行迁移【英文标题】:Migrations with SequelizeJS and CLI 【发布时间】:2017-04-28 13:10:27 【问题描述】:

目前我已经开始在我使用SEQUELIZE ORM 的NODE JS 上工作。 Sequelize 确实支持使用 sequelize-cli 进行迁移,但文档并未解释有关如何使用迁移的所有细节。我想知道是否可以使用 Sequelize CLI 进行以下操作。考虑到 PROD 部署,以下几点很重要

    通过查看模型自动生成迁移文件 根据对模型所做的新更改自动生成迁移文件 生成迁移的 SQL 脚本,以便我们可以在 PROD 上运行它 环境特定的迁移(Dev、Stage、Prod

我已经阅读了文档,但它没有解释上述任何一点。请帮我解决这个问题,我

【问题讨论】:

【参考方案1】:

使用迁移的想法是它们是您的数据库之王。它们是唯一会更改数据库架构的东西,而更改数据库架构的唯一方法就是简单地运行迁移。

回答您的问题:

1.通过查看模型自动生成迁移文件

不要。手动生成迁移。如果要更改特定表的列,请先生成迁移,然后再修改相应的模型。迁移是数据库之王。模特排在第二位。

2。根据对模型所做的新更改自动生成迁移文件

不要。同上。

3.生成迁移的 SQL 脚本,以便我们可以在 PROD 上运行它

不要。您应该能够直接在生产环境中运行迁移,连接到生产数据库,就像在开发环境中运行它们一样,使用sequelize db:migrate。每次将新代码推送到生产环境时,您的部署脚本都应自动在生产数据库上运行 sequelize db:migrate

4.特定于环境的迁移(Dev、Stage、Prod)

绝对不会。每个迁移都应该在每个环境中运行。无论环境如何,您的数据库都应具有相同的架构。

更新:这是一个示例 migartion(向上和向下运行)以添加新的布尔列:

'use strict';

module.exports = 
  up: function (queryInterface, Sequelize) 
    return queryInterface.addColumn(
      'my_table',
      'my_new_column',
      
        type: Sequelize.BOOLEAN,
      
    )
  ,

  down: function (queryInterface, Sequelize) 
    return queryInterface.removeColumn('my_table', 'my_new_column')
  
;

【讨论】:

非常感谢@joshua.paling 现在我有了续集迁移的好主意,并且我了解我在其中的角色。现在我将编写迁移,我看到了两种方法。 1.使用sequelize api 2.sql脚本。我认为第二种方法会更干净,因为我将编写与 api 相对的 sql 查询。由于 api 没有很好的文档记录,我对使用它们没有信心。。当我将列添加到表时,我尝试使用 api 进行迁移。 .但是当我尝试撤消它时..迁移没有删除列..这让我想到了sql查询。你请推荐你对此的建议 理想情况下,您应该使用 sequelize API。这样做的主要好处是,无论您使用哪个数据库(例如,mysql、Postgres 等),您的迁移都应该工作。如果 sequelize 的 API 不支持你想做的事情,那么写普通的 SQL 是可以的。在更新和删除列方面,我将使用适合我的示例迁移来更新我的答案。 非常感谢@joshua.paling。我真的很感谢你的所有努力。我同意这样一个事实,即无论使用 API 编写迁移似乎有技巧,我们都应该使用纯 SQL。再次感谢 ! :)

以上是关于使用 SequelizeJS 和 CLI 进行迁移的主要内容,如果未能解决你的问题,请参考以下文章

SequelizeJS 中的慢关联

Sequelizejs 中的 .save 和 .create 有啥区别?

如何在迁移后向架构添加新属性?

我真的需要在 sequelizejs 中定义模型吗?

当迁移在另一个项目中使用 cli 时,我应该如何添加新的迁移?

Sequelize js - 限制和排序错误