由于更新的要求,我目前正在尝试执行包含两部分的数据库迁移:
我目前的做法如下:
准备迁移文件到
addColumn
,并进行必要的外键关联(附带约束)。我确实希望该列不能为空,但如果我在迁移时这样做,那么它将失败,因为表已经包含不满足当前要求的记录。
准备一个
script.js
文件(例如),该文件获取该表的所有记录,映射它们并为新列添加数据。我想,这可能是一个耗时的过程,并且可能会锁定数据库。不用说,顺便说一句,我将使用交易。
执行另一次迁移,这次添加
allowNull: false
约束,数据迁移完成。
我的问题是:这里需要注意什么?如果我实时运行此设置,我怎么可能把生产用户的事情搞得这么严重?
我的一些建议:
当您尚未迁移所有数据并且某些记录仍然缺少列值时,您的应用程序必须准备好处理这两种情况。如果您有大量数据并且无法快速迁移所有记录,则尤其如此。您可以将功能交付拆分为更小的版本来实现这一目标。
您不一定需要使用数据库事务。您需要使迁移具有幂等性。因为您的代码可以处理这两种情况,所以在迁移运行时您可以正常操作。在这种情况下,您不会锁定您的表/记录,即使您在中间失败,您也可以在从失败那一刻重新启动后继续。