如何使用Go应用程序代码中的值创建一个新的列?理想情况下,我会遍历每一行,调用Go代码,并使用返回值作为列值。Go代码是有状态的。也就是说,它作用于每一个新行更新的数据结构,并根据这些信息计算一个值。
我想做的是进行一次迁移,将新列添加为可空,然后在迁移之后,运行一个Go程序来回填行。然而,如果所有这些都可以在一次迁移中完成,特别是因为该列从一开始就应该是NOT NULL。
我们使用Flyway进行迁移。我们的数据库是Postgres 11.5。
如何使用Go应用程序代码中的值创建一个新的列?理想情况下,我会遍历每一行,调用Go代码,并使用返回值作为列值。Go代码是有状态的。也就是说,它作用于每一个新行更新的数据结构,并根据这些信息计算一个值。
我想做的是进行一次迁移,将新列添加为可空,然后在迁移之后,运行一个Go程序来回填行。然而,如果所有这些都可以在一次迁移中完成,特别是因为该列从一开始就应该是NOT NULL。
我们使用Flyway进行迁移。我们的数据库是Postgres 11.5。
1条答案
按热度按时间ax6ht2ek1#
通过迁移不可能以这种方式填充一个新列--即在一个事务中的单个步骤中。相反,您需要类似于以下方法的方法:
1.更新应用程序,以优雅地处理新列中具有时间戳123之前的sentinel值的行。
1.使用非空约束和默认sentinel值在迁移中添加新列。
1.运行go程序,将时间戳123之前的行的sentinel值更新为一个合适的值。
这种方法需要对应用程序进行更改,但不需要维护窗口,它还确保迁移不会因为迁移时未满足约束而失败。