
使用 Go 应用程序代码中的值回填新列的最佳方法是什么?理想情况下,我会遍历每一行,调用 Go 代码,并使用返回值作为列值。 Go 代码是有状态的。也就是说,它作用于在每个新行上更新的数据结构,并根据此信息计算一个值。
我正在考虑做的是进行一次迁移,将新列添加为可为空,然后在迁移后运行一个 Go 程序来回填行。但是,如果所有这些都可以在一次迁移中完成,那就更好了,特别是因为该列从一开始就应该不为 NULL。
我们使用 Flyway 进行迁移。我们的数据库是 Postgres 11.5。
1.修正会员卡升级会员级别的判定方式2.修正了订单换货状态用户管理中心订单不显示的问题3.完善后台积分设置数据格式验证方式4.优化前台分页程序5.解决综合模板找回密码提示错误问题6.优化商品支付模块程序7.重写优惠卷代码8.优惠卷使用方式改为1卡1号的方式9.优惠卷支持打印功能10.重新支付模块,所有支付方式支持自动对账11.去掉规格库存显示12.修正部分功能商品价格显示4个0的问题13.全新的支
正确答案
不可能通过迁移以这种方式填充新列——即在事务内一步完成。相反,您需要类似以下方法:
- 更新应用以正常处理新列中标记值在时间戳 123 之前的行。
- 在迁移中添加具有非空约束和默认标记值的新列。
- 运行 go 程序,将时间戳 123 之前的行的哨兵值更新为合适的值。
此方法需要对应用程序进行更改,但不需要维护时段。它还确保迁移不会因为迁移时不满足约束而失败。









