Sequelize:如何在生产中不锁定数据库的情况下执行架构和数据迁移

问题描述 投票:0回答:1

由于更新的要求,我目前正在尝试执行包含两部分的数据库迁移:

  1. 向关系添加新列,并且
  2. 使用与此新列相关的数据更新数据库中所有预先存在的记录。

我目前的做法如下:

  1. 准备迁移文件到

    addColumn
    ,并进行必要的外键关联(附带约束)。我确实希望该列不能为空,但如果我在迁移时这样做,那么它将失败,因为表已经包含不满足当前要求的记录。

  2. 准备一个

    script.js
    文件(例如),该文件获取该表的所有记录,映射它们并为新列添加数据。我想,这可能是一个耗时的过程,并且可能会锁定数据库。不用说,顺便说一句,我将使用交易。

  3. 执行另一次迁移,这次添加

    allowNull: false
    约束,数据迁移完成。

我的问题是:这里需要注意什么?如果我实时运行此设置,我怎么可能把生产用户的事情搞得这么严重?

database sequelize.js migration schema sequelize-cli
1个回答
0
投票

我的一些建议:

  1. 当您尚未迁移所有数据并且某些记录仍然缺少列值时,您的应用程序必须准备好处理这两种情况。如果您有大量数据并且无法快速迁移所有记录,则尤其如此。您可以将功能交付拆分为更小的版本来实现这一目标。

  2. 您不一定需要使用数据库事务。您需要使迁移具有幂等性。因为您的代码可以处理这两种情况,所以在迁移运行时您可以正常操作。在这种情况下,您不会锁定您的表/记录,即使您在中间失败,您也可以在从失败那一刻重新启动后继续。

© www.soinside.com 2019 - 2024. All rights reserved.