HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: liquibase, flyway, базы данных, xml, версионирование данных, iaс-инструменты, rollback, infrastructure as code, yml-код, firstname, cli liquibase, миграции, процесс непрерывной поставки, lastname, club_status</p>
1 <p>Теги: liquibase, flyway, базы данных, xml, версионирование данных, iaс-инструменты, rollback, infrastructure as code, yml-код, firstname, cli liquibase, миграции, процесс непрерывной поставки, lastname, club_status</p>
2 <p>В<a>первой части</a>мы обсудили проблемы, которые решаются с помощью IaС-инструментов. Определив задачи и результаты их решения, в этой заметке я хотел бы рассказать о том, как можно управлять миграциями с помощью liquibase. Есть два способа: 1. Описывать и запускать их при помощи CLI liquibase в процессе деплоя; 2. Описывать миграции вместе с кодом приложений и запускать их применение во время запуска приложений. В первом случае, удобство заключается в том, что все миграции и сама утилита могут поставляться в виде версионированного артефакта. Мне кажется, он подойдёт для монолитных приложений. Второй же даёт простор внесения изменений в случае, когда у проекта много сервисов, которые часто и мало меняются. Стоит учитывать, что способ описания миграций, которые лежат рядом с кодом приложения, также ограничены возможностями интеграции инструмента с кодом проекта. В случае с liquibase интеграция выполнена с Java-кодом с поддержкой интеграции в ряд фреймворков.</p>
2 <p>В<a>первой части</a>мы обсудили проблемы, которые решаются с помощью IaС-инструментов. Определив задачи и результаты их решения, в этой заметке я хотел бы рассказать о том, как можно управлять миграциями с помощью liquibase. Есть два способа: 1. Описывать и запускать их при помощи CLI liquibase в процессе деплоя; 2. Описывать миграции вместе с кодом приложений и запускать их применение во время запуска приложений. В первом случае, удобство заключается в том, что все миграции и сама утилита могут поставляться в виде версионированного артефакта. Мне кажется, он подойдёт для монолитных приложений. Второй же даёт простор внесения изменений в случае, когда у проекта много сервисов, которые часто и мало меняются. Стоит учитывать, что способ описания миграций, которые лежат рядом с кодом приложения, также ограничены возможностями интеграции инструмента с кодом проекта. В случае с liquibase интеграция выполнена с Java-кодом с поддержкой интеграции в ряд фреймворков.</p>
3 <h2>Рассмотрим пример описания миграций в виде кода</h2>
3 <h2>Рассмотрим пример описания миграций в виде кода</h2>
4 <p>Для описания миграций liquibase предоставляет возможность описывать их в виде xml- или yml-файлов. Две версии изменений в виде yml будут выглядеть так:</p>
4 <p>Для описания миграций liquibase предоставляет возможность описывать их в виде xml- или yml-файлов. Две версии изменений в виде yml будут выглядеть так:</p>
5 databaseChangeLog: - preConditions: - runningAs: username: migrations<p>- changeSet: id: 1 author: holyowly changes: - createTable: tableName: club columns: - column: name: id type: int autoIncrement: true constraints: primaryKey: true nullable: false - column: name: firstname type: varchar(50) - column: name: lastname type: varchar(50) constraints: nullable: false - column: name: club_status type: varchar(8)</p>
5 databaseChangeLog: - preConditions: - runningAs: username: migrations<p>- changeSet: id: 1 author: holyowly changes: - createTable: tableName: club columns: - column: name: id type: int autoIncrement: true constraints: primaryKey: true nullable: false - column: name: firstname type: varchar(50) - column: name: lastname type: varchar(50) constraints: nullable: false - column: name: club_status type: varchar(8)</p>
6 <p>- changeSet: id: 2 author: holyowly changes: - addColumn: tableName: club columns: - column: name: club_status type: varchar(32)</p>
6 <p>- changeSet: id: 2 author: holyowly changes: - addColumn: tableName: club columns: - column: name: club_status type: varchar(32)</p>
7 <p>Пример демонстрирует описание двух миграций в виде yml-кода: в первой версии создаётся таблица club с тремя колонками (firstname, lastname, club_status); вторая миграция изменяет тип для club_status, расширяя возможности описания club_status по количеству символов. Такая ситуация может возникнуть, когда сперва создался функционал требующий наличия таблицы club у приложения, а через некоторое время функционал, затрагивающий колонку club_status, потребовал возможности хранить больше текста в ней. Во время выполнения вышеописанного сценария liquibase считает yml-код и попытается его применить. А узнать о том, нужно ли применять миграции, их статус и очередность выполнения liquibase сможет при помощи мета-таблицы. За счёт неё же достигается идемпотентность.</p>
7 <p>Пример демонстрирует описание двух миграций в виде yml-кода: в первой версии создаётся таблица club с тремя колонками (firstname, lastname, club_status); вторая миграция изменяет тип для club_status, расширяя возможности описания club_status по количеству символов. Такая ситуация может возникнуть, когда сперва создался функционал требующий наличия таблицы club у приложения, а через некоторое время функционал, затрагивающий колонку club_status, потребовал возможности хранить больше текста в ней. Во время выполнения вышеописанного сценария liquibase считает yml-код и попытается его применить. А узнать о том, нужно ли применять миграции, их статус и очередность выполнения liquibase сможет при помощи мета-таблицы. За счёт неё же достигается идемпотентность.</p>
8 <h2>И напоследок о роллбеках (откаты миграций)</h2>
8 <h2>И напоследок о роллбеках (откаты миграций)</h2>
9 <p>liquibase и flyway поддерживают данный функционал. Однако стоит учитывать, что поддержка rollback иногда может быть более затратной, нежели выкатка исправления (привнесение небольших и частых изменений).<i>Есть вопрос? Пишите в комментариях!</i></p>
9 <p>liquibase и flyway поддерживают данный функционал. Однако стоит учитывать, что поддержка rollback иногда может быть более затратной, нежели выкатка исправления (привнесение небольших и частых изменений).<i>Есть вопрос? Пишите в комментариях!</i></p>
10  
10