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

jdg4fx2g  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(147)

如何使用Go应用程序代码中的值创建一个新的列?理想情况下,我会遍历每一行,调用Go代码,并使用返回值作为列值。Go代码是有状态的。也就是说,它作用于每一个新行更新的数据结构,并根据这些信息计算一个值。
我想做的是进行一次迁移,将新列添加为可空,然后在迁移之后,运行一个Go程序来回填行。然而,如果所有这些都可以在一次迁移中完成,特别是因为该列从一开始就应该是NOT NULL。
我们使用Flyway进行迁移。我们的数据库是Postgres 11.5。

ax6ht2ek

ax6ht2ek1#

通过迁移不可能以这种方式填充一个新列--即在一个事务中的单个步骤中。相反,您需要类似于以下方法的方法:
1.更新应用程序,以优雅地处理新列中具有时间戳123之前的sentinel值的行。
1.使用非空约束和默认sentinel值在迁移中添加新列。
1.运行go程序,将时间戳123之前的行的sentinel值更新为一个合适的值。
这种方法需要对应用程序进行更改,但不需要维护窗口,它还确保迁移不会因为迁移时未满足约束而失败。

相关问题