Gymterview
middle

Что такое preconditions (предусловия)?

Preconditions — это проверки, которые Liquibase выполняет перед применением changeset (или перед обработкой всего changelog). Если предусловие не выполнено, Liquibase может пропустить changeset, пометить его как выполненный, вызвать ошибку или остановиться.

Основные предусловия

Precondition Описание
tableExists Проверяет, существует ли таблица
columnExists Проверяет, существует ли столбец
indexExists Проверяет, существует ли индекс
foreignKeyConstraintExists Проверяет, существует ли внешний ключ
viewExists Проверяет, существует ли представление
sequenceExists Проверяет, существует ли последовательность
dbms Проверяет тип СУБД
runningAs Проверяет имя пользователя БД
sqlCheck Выполняет SQL-запрос и сверяет результат
changeSetExecuted Проверяет, был ли выполнен другой changeset

Действия при невыполнении предусловия (onFail)

Значение Поведение
HALT Прекратить выполнение (по умолчанию)
CONTINUE Пропустить changeset и продолжить
MARK_RAN Пометить changeset как выполненный и продолжить
WARN Вывести предупреждение и продолжить

Пример

Пример
<changeSet id="6" author="fedorov">
    <preConditions onFail="MARK_RAN">
        <not>
            <columnExists tableName="users" columnName="phone"/>
        </not>
    </preConditions>

    <addColumn tableName="users">
        <column name="phone" type="VARCHAR(20)"/>
    </addColumn>
</changeSet>

В данном примере, если столбец phone уже существует, changeset будет помечен как выполненный (MARK_RAN) и пропущен. Это удобно при работе с уже существующими БД.

Комбинирование предусловий с логическими операторами
<preConditions onFail="HALT">
    <and>
        <dbms type="postgresql"/>
        <tableExists tableName="users"/>
        <not>
            <columnExists tableName="users" columnName="middle_name"/>
        </not>
    </and>
</preConditions>

На собеседовании: интервьюер хочет услышать практический кейс использования preconditions — например, безопасное добавление столбца в таблицу, которая может уже содержать его. Важно знать разницу между HALT и MARK_RAN.