Liquibase: как создать значение для столбца при разборе - PullRequest
0 голосов
/ 22 января 2019

Я хотел бы программно сгенерировать значение (id) для столбца во время вставки, используя журнал изменений Liquibase (XML).Например:

<changeSet ...>
    <preConditions ...>
        <insert tableName="my_table">
            <column name="my_id" value="<call-code-to-generate-id>" />
            ...
        </insert>

Мне нужно сделать это программно, потому что для идентификатора нужен символьный префикс (определяется кодом), за которым следует порядковый номер (старый код и множество других компонентов в системе используют его).Журнал изменений должен поддерживать как Oracle, так и SQL Server, а порядковые номера генерируются по-разному (код в настоящее время обрабатывает это).

Я смотрел на ChangeLogParser и SqlGenerator, но я не вижу простого способа сделать это,Я думал, что можно было бы проанализировать XML в поисках 'value =' 'и заменить значение сгенерированным идентификатором, но я не уверен, как это повлияет на Liquibase, чтобы определить, был ли обновлен журнал изменений или нет.

Кто-нибудь знает, возможно ли это, и если да, то как это сделать?

Я использую Liquibase 3.5.3 и Java 8.

1 Ответ

0 голосов
/ 24 января 2019

Я получил эту работу, используя подкласс класса 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;
    }
}
...