在 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 开始时,这种方法不是一个很好和可靠的方法。
我有一种情况,在以前的版本中,我使用 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 开始时,这种方法不是一个很好和可靠的方法。