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.