在 liquibase 中更新变更集的方法

Approach to have updating change sets in liquibase

我有一种情况,在以前的版本中,我使用 liquibase 脚本在 table1 中有 0 个种子值。我的主键是 java 中的一个序列,值从 100000.

开始

这持续了几个版本。

现在,在后续版本中,突然需要将一些(例如 10 个)值播种到 table table1 中。 作为日期迁移过程,table table1 中可能有一些手动(使用应用程序)插入的值。为了主键不与已经存在的键冲突,我计划从 1 到 10 开始,因为序列从 10000 开始,并且永远不会有小于 100000 的值。

我可以选择使用两种方法编写备用脚本:

方法一代码如下:

- changeSet:
    id: ID-1
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 >= 1 and column_1 <= 10;
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(1, 'text1');
           INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(2, 'text2');
        .....
           INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(10, 'text10');

方法二代码如下:

- changeSet:
    id: ID-1
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 = 1 
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(1, 'text1');

- changeSet:
    id: ID-2
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 = 2
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(2, 'text2');

---- 

- changeSet:
    id: ID-10
    author: demo
    preConditions:
      onFail: MARK_RAN
      sqlCheck:
        expectedResult: 0
        sql: select count(*) from ${schema}.table1 where column_1 = 10
    changes:
    - sql:
      dbms: PostgreSQL
      splitStatements: true
      stripComments: true
      sql: INSERT INTO ${schema}.table1 (column_1, column_2) VALUES(10, 'text10');

我认为使用方法 1,因为检查较少,但我想先确认一下,因为代码更改将直接进入客户环境,而未来的更改上述逻辑将带来校验和错误。

如果您需要全部 10 行数据或什么都不需要,并且您确定 select count(*) from ${schema}.table1 where column_1 >= 1 and column_1 <= 10; 确实 return 0,那么请使用第一种方法。

否则,我会采用第二种方法。

我不担心校验和错误,因为您应该使 changeSet 的 ID 唯一。

另外,在我看来,当 ID 序列通常从 10000 开始但在某些边缘情况下(比如这个)它从 1 开始时,这种方法不是一个很好和可靠的方法。