Liquibase и changeset’ы на чистом SQL

в 15:10, , рубрики: java, liquibase

Не все знают, но начиная с версии 2.0 Liquibase поддерживает возможность использования файлов с «чистым SQL» в качестве файлов changeset’ов. Под катом хочу немного описать, из чего они состоят.

Для определения метаданных в файлах SQL используются комментарии, каждый файл changeset’ов начинается с комментария:

--liquibase formatted sql

Каждый changeset в файле начинается с комментария, в котором указываются все необходимые параметры в следующем виде:

--changeset author:id attribute1:value1 attribute2:value2 [...]

Для changeset’а можно задать следующие атрибуты:

Атрибут Описание
stripComments Если установлено значение true, то перед выполнением SQL операторов удаляются все комментарии. Значение по умолчанию true.
splitStatements Если установлено значение false, то Liquibase не будет разделять SQL выражения на символе «;», используется для описания подпрограмм.
endDelimiter Задает разделитель SQL операторов, по умолчанию «;».
runAlways Если установлено значение true, то список изменений будет выполнятся во время каждой сборки проекта.
runOnChange Если установлено значение true, то при внесении правок changeset, он будет выполнен при следующей сборке проекта.
context Создание метки для changeset’а, которые в последствии можно выполнить по запросу.
runInTransaction Если установлено значение true, то все операторы SQL будут выполняться в рамках одной транзакции, если это возможно. По умолчанию значение true.
failOnError True – весь changeset будет отменен при возникновении ошибок во время выполнения.
dbms Указание типа СУБД, для которой написан changeset.

После задания параметров указываются предусловия (опционально). Далее идет набор SQL операторов, разделенных точкой с запятой или символом, указанным в атрибуте «endDelimiter».

В настоящий момент в changeset’ах на чистом SQL поддерживается лишь один вид предусловия: SQL Check. Пример предусловия:

--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM my_table

В параметр expectedResult передается значение, которое возвращает SQL запрос. Запрос обязательно должен возвращать единственное значение.

Для задания поведения обработки проверки предусловия используется синтаксис аналогичный заданию параметров changeset’а:

--preconditions attribute1:value1 attribute2:value2 [...]

Атрибуты могут быть следующие:

Атрибут Описание
onFail Действия в случае, когда changeset не может быть выполнен.
onError Действия в случае, когда changeset возвращают ошибку.
onUpdateSQL Действия, которые будут выполнены над changeset’ом, в случае выполнения его в режиме updateSQL.
onFailMessage Сообщение, которое будет возвращено если changeset не может быть выполнен.
onErrorMessage Сообщение, которое будет возвращено если changeset выполняется с ошибкой.

В атрибуты onFail и onError могут быть переданы следующие значения:

Значение Описание
HALT Немедленно прекратить выполнение changeset’а.
CONTINUE Содержимое changeset’а будет пропущено и будет предпринята попытка по повторному его выполнению в следующий раз.
MARK_RAN Changeset будет помечен как выполненный.
WARN Будет сгенерировано предупреждение и changeset продолжит выполнятся в нормальном режиме.

Changeset’ы могут включать SQL выражения для отката. Выражения отката описываются в форме комментария:

--rollback SQL STATEMENT

Ну и в завершение небольшой примерчик файла changeset’ов:


--liquibase formatted sql

--changeset User1:1 
create table test1 (
    id int primary key,
    name varchar(255)
);
--rollback drop table test1;

--changeset User2:1 
--preconditions onFail:CONTINUE onError:CONTINUE
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM test1
insert into test1 (id, name) values (1, 'User1');
--rollback delete from test1 where id = 1;

Подытожив все вышесказанное, хочется добавить, что такие файлы читаются и пишутся гораздо проще, чем xml'ки, но не все плюшки еще поддерживаются (пример по предусловиям, поддерживается сейчас только SQL Check).

Автор: ChudakovII

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js