SpringBoot(Kotlin)-将数据迁移作为批处理作业一次性运行



所以,我有一个特定的问题,我找不到Spring的最佳实践。

我在一个Postgres数据库前面有一个Spring实例。我有一个域实体,我正在添加一些字段(使用flyway(。

本质上,假设我有以下对象:

Book
last_text_update // 2018-11-25 07:00:00
last_writer      // PUBLISHER
is_finished      // true
contract_closed_timestamp // NULL

由此,我们进行了类似的奇怪计算

"如果last_writer==PUBLISHER&is_finished==true,则返回is_SELLING_IN_STORES">

正如你所能想象的,这是丑陋的,我正在将其重构为以下内容:

Book
processedStatus: PUBLISHED/EDITING/PROPOSAL
workStatus: AWAITING_EDITOR_FEEDBACK/AWAITING_CHANGES/FINISHED
etc.etc.

因此,我已经准备好了SQL迁移,其中添加了必要的状态列。在我看来,我的选择是:

1( 在原始SQL中完成所有列转换,并像其他迁移一样在生产服务器上运行迁移。即where timestamp = blah and other timestamp = blah, set status as follows

2( 运行一次性批处理作业,循环处理每个对象并更新它。

与在SQL中执行相比,在Kotlin代码中通过批处理操作似乎更容易,但在这方面的共识是什么?有没有建议做一次性的批处理工作(即ssh进入实例并手动运行它,通过API使用HTTP启动它,等等(,或者我只是吸收它并使用SQL?

考虑到,使用SQL的迁移(选项1(似乎更合理

  1. 您已经在使用Flyway
  2. 对我来说,污染实体模型以允许它进行数据迁移工作似乎很丑陋。例如。
    • 您将需要实体模型在给定"不完整"持久性表单的情况下进行操作,并且
    • 您需要保留过时的字段等

如果您也在许多实体中循环,请不要忘记性能差异。除非有一些特殊要求需要使用实体模型进行修改(例如发送事件等(,否则使用SQL进行数据迁移似乎更合理。

最新更新