使用 Go 代码中的值回填新列

Backfilling new column using value from Go code

提问人:user2233706 提问时间:11/15/2023 最后编辑:Daveuser2233706 更新时间:11/16/2023 访问量:65

问:

使用 Go 应用程序代码中的值回填新列的最佳方法是什么?理想情况下,我会遍历每一行,调用 Go 代码,并使用返回值作为列值。Go 代码是有状态的。也就是说,它作用于在每个新行上更新的数据结构,并从此信息中计算出一个值。

我正在考虑做的是进行迁移,将新列添加为可为 null,然后在迁移后运行一个将回填行的 Go 程序。但是,如果所有这些都可以在一次迁移中完成,那就更好了,特别是因为此列从一开始就不应该为 NULL。

我们使用 Flyway 进行迁移。我们的数据库是 Postgres 11.5。

PostgreSQL Go 架构 飞道

评论

1赞 jjanes 11/15/2023
如果它是有状态的,这是否意味着输出取决于其先前的输入,即其输入的顺序?
0赞 user2233706 11/15/2023
是的。它作用于当前行和之前处理过的内容,这些内容存储在数据结构中。

答:

3赞 Dave 11/16/2023 #1

不可能以这种方式使用迁移填充新列 - 即在事务中通过单个步骤填充。相反,您需要类似于以下方法:

  1. 更新应用程序,以正常处理时间戳 123 之前新列中具有哨兵值的行。
  2. 在迁移中添加具有非 null 约束和默认哨兵值的新列。
  3. 运行 go 程序,将时间戳 123 之前的行的 sentinel 值更新为适当的值。

此方法需要对应用程序进行更改,但不需要维护时段。它还确保迁移不会因迁移时未满足约束而失败。

评论

0赞 user2233706 11/16/2023
还行。将此程序放在目录结构中的最佳位置在哪里?
1赞 Dave 11/22/2023
我使用过许多具有类似目录的存储库。/devops/scripts/one-time