Liquibase:如何在解析时为列生成值

时间:2019-01-22 01:56:47

标签: liquibase

我想使用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。

1 个答案:

答案 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;
    }
}