Liquibase

Дарья Матвеева · January 12, 2024

Как произвести изменение схемы базы данных в работающем приложении?

Как добавить новую таблицу или новую колонку в таблицу?

Как обеспечить переносимость изменений, если приложение развернуто в нескольких средах: в контуре разработки, тестирования, и промышленном контуре?

Различные подходы описаны, например, в подробной статье на хабре.

На одном из проектов, где я работала, чтобы иметь возможность добавлять новые атрибуты по мере разработки, была огромная таблица, куда для всех объектов добавлялись новые атрибуты и их значения, и был написан собственный ORM фреймворк.

На текущем проекте используем систему управления версионированием баз данных Liquibase.

Изменение БД описывается в changeset, которые собираются в changelog. Поддерживаются форматы XML, Yaml, JSON, SQL.

Для примера создадим файл changelog.xml и customer_table.sql, где опишем создание таблицы клиентов приложения.

changelog.xml

<databasechangeLog>
    <include author="darya"
             file="db/customer_table.sql"/>
</>

customer_table.sql


create table customer
(
    id numeric
    name varchar2(200)
    surname varchar2(200)    
)

При запуске приложения Liquibase выполняет changeset и записывает его хэш таблицу databasechangelog.

Теперь допустим, нам нужно добавить в таблицу customer атрибут email. Если просто изменить changeset, то при перезапуске приложения его хэш изменится, и приложение упадет с ошибкой.

Необходимо написать новый changeset, модифицирующий таблицу.

update_customer_table.sql

alter table customer
add email varchar2

changelog.xml

<databasechangeLog>
    <include author="darya"
             file="db/customer_table.sql"/>
    <include author="darya"
             file="db/update_customer_table.sql"/>
</>

Но если приложение еще не поставлено на тестовый\промышленный контур, скорее всего будет предпочтительнее не создавать новый changeset, чтобы сохранить читаемость наших миграций.

Можно удалить changeset с модифицируемой таблицой из databasechangelog перед запуском приложения и просто дописать email в create в customer_table.sql.

VK, Telegram