我想使用Liquibase变更日志(XML)以编程方式为列生成一个值(id)。例如:
<changeSet ...>
<preConditions ...>
<insert tableName="my_table">
<column name="my_id" value="<call-code-to-generate-id>" />
...
</insert>
我需要以编程方式执行此操作,因为id需要一个字符前缀(由代码确定),后跟一个序列号(传统代码和系统中的许多其他组件使用它)。更改日志需要同时支持Oracle和SQL Server,并且序列号的生成方式不同(当前代码可处理此问题)。
我已经看过ChangeLogParser和SqlGenerator,但是我没有看到简单的方法来做到这一点。我以为可以解析XML以查找'value ='并将其替换为生成的ID,但是我不确定这对Liquibase的影响,以确定变更日志是否已更新
有人知道这是否可行吗?
我正在使用Liquibase 3.5.3和Java 8。
答案 0 :(得分:0)
我使用Liquibase类 InsertDataChange 的子类来完成这项工作。我将该类放在包中 liquibase.sqlgenerator.ext 中,以便Liquibase自动注册它。
package liquibase.sqlgenerator.ext;
import liquibase.change.ColumnConfig;
import liquibase.change.core.InsertDataChange;
import liquibase.database.Database;
import liquibase.statement.SqlStatement;
public class MyInsertDataChange extends InsertDataChange {
@Override
public SqlStatement[] generateStatements(final Database database) {
for (final ColumnConfig column : getColumns()) {
final String tableName = getTableName();
final String name = column.getName();
final String value = column.getValue();
if (columnNeedsId(tableName, name, value)) {
column.setValue(generateId(tableName, name, value));
}
}
return super.generateStatements(database);
}
private boolean columnNeedsId(final String tableName, final String name, final String value) {
// Details omitted
return true;
}
private String generateId(final String tableName, final String name, final String value) {
// Details omitted
final String sequenceName = "whatever";
final long sequenceNumber = 123L;
return sequenceName + sequenceNumber;
}
}