Gymterview
middle

Как использовать параметры и подстановки (property substitution)?

Property substitution — механизм Liquibase, позволяющий использовать переменные в changelog-файлах для адаптации миграций под разные окружения и СУБД.

Определение параметров в changelog

Пример с параметрами в XML
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">

    <property name="table.prefix" value="app_"/>
    <property name="varchar.type" value="VARCHAR" dbms="postgresql"/>
    <property name="varchar.type" value="NVARCHAR" dbms="mssql"/>
    <property name="id.type" value="BIGINT"/>

    <changeSet id="14" author="dev">
        <createTable tableName="${table.prefix}users">
            <column name="id" type="${id.type}" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="name" type="${varchar.type}(255)"/>
        </createTable>
    </changeSet>

</databaseChangeLog>

Передача параметров

Через командную строку:

Пример
liquibase -Dtable.prefix=myapp_ update

Через Spring Boot:

Пример
spring.liquibase.parameters.table.prefix=app_
spring.liquibase.parameters.schema.name=banking

Через файл liquibase.properties:

Пример
parameter.table.prefix=app_
parameter.schema.name=banking

Приоритет параметров (от высшего к низшему)

  1. Параметры из командной строки (-D)
  2. Параметры из liquibase.properties
  3. Параметры из Spring Boot (spring.liquibase.parameters.*)
  4. Параметры, определённые в <property> внутри changelog

На собеседовании: важно знать приоритет параметров и типичный кейс использования — адаптация типов данных под разные СУБД (VARCHAR для PostgreSQL, NVARCHAR для MSSQL). Частая ошибка — не упомянуть, что параметры из командной строки имеют наивысший приоритет.