Gymterview
junior

Какова структура changeset?

Changeset — основной строительный блок миграции. Он содержит атрибуты идентификации, опциональные предусловия, одно или несколько изменений и инструкции для отката.

Пример полной структуры changeset
<changeSet id="2" author="sidorov"
           context="dev,test"
           labels="JIRA-123"
           runOnChange="false"
           runAlways="false"
           failOnError="true"
           dbms="postgresql">

    <!-- Предусловия (опционально) -->
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="transactions"/>
        </not>
    </preConditions>

    <!-- Комментарий (опционально) -->
    <comment>Создание таблицы транзакций</comment>

    <!-- Одно или несколько изменений -->
    <createTable tableName="transactions">
        <column name="id" type="BIGINT" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="account_id" type="BIGINT">
            <constraints nullable="false"
                         foreignKeyName="fk_transaction_account"
                         references="accounts(id)"/>
        </column>
        <column name="amount" type="DECIMAL(19,2)"/>
        <column name="created_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
    </createTable>

    <!-- Rollback (опционально) -->
    <rollback>
        <dropTable tableName="transactions"/>
    </rollback>

</changeSet>

Основные атрибуты changeset

Атрибут Описание
id Уникальный идентификатор (обязательный)
author Автор изменения (обязательный)
dbms СУБД, для которой применяется changeset (postgresql, oracle, mysql и т.д.)
context Контекст выполнения (dev, test, prod)
labels Метки для фильтрации
runOnChange Перевыполнить, если changeset изменился (по умолчанию false)
runAlways Выполнять при каждом запуске (по умолчанию false)
failOnError Остановиться при ошибке (по умолчанию true)
logicalFilePath Переопределить путь к файлу для расчёта уникальности

На собеседовании: важно назвать обязательные атрибуты (id, author) и объяснить разницу между runOnChange и runAlways. Частая ошибка — путать эти два атрибута.