Ответ
Flyway и Liquibase — это популярные инструменты для контроля версий и миграции схемы базы данных (Database Migration). Они позволяют применять инкрементальные изменения к БД предсказуемо и воспроизводимо.
Ключевые различия
| Критерий | Flyway | Liquibase |
|---|---|---|
| Подход к миграциям | Императивный (код-ориентированный). Миграции — это SQL-скрипты (или Java-код), которые выполняются последовательно. | Декларативный (модель-ориентированный). Изменения описываются в XML, YAML, JSON или SQL в формате, независимом от СУБД. Liquibase сам генерирует нужный SQL. |
| Формат миграций | Нативные SQL-файлы (предпочтительно) или Java-классы. Имена файлов содержат версию. (например, V1__Create_table.sql). |
XML (changeset), YAML, JSON или SQL в специальном формате. |
| Независимость от СУБД | Низкая. Вы пишете SQL для конкретной СУБД. Есть возможность использовать placeholders и callbacks. | Высокая. Описываете изменение один раз (например, "добавить столбец"), а Liquibase транслирует это в SQL для MySQL, PostgreSQL, Oracle и т.д. |
| Откат изменений (Rollback) | Требует написания отдельных скриптов для отката (например, U1__Drop_table.sql). Поддержка undo ограничена. |
Может автоматически генерировать SQL для отката для многих операций (например, dropColumn из addColumn). Также поддерживает ручное описание отката. |
| Отслеживание выполненных миграций | Создает в БД таблицу flyway_schema_history. |
Создает в БД таблицы DATABASECHANGELOG и DATABASECHANGELOGLOCK. |
| Сложность и гибкость | Проще, легковеснее, ближе к SQL. | Более комплексный, мощный, с большим количеством встроенных функций (diff, generate-changelog, контексты, labels). |
Примеры
Flyway (SQL-миграция)
Файл: V1.0__create_user_table.sql
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Liquibase (XML changeset)
Файл: db.changelog.xml
<changeSet id="1" author="dev">
<createTable tableName="user">
<column name="id" type="BIGINT" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="username" type="VARCHAR(255)">
<constraints nullable="false" unique="true"/>
</column>
<column name="created_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
</createTable>
</changeSet>
Когда что выбирать:
- Flyway: Если команда предпочитает прямой SQL, проект использует одну СУБД, нужен простой и быстрый инструмент.
- Liquibase: Если нужна независимость от СУБД (мультиплатформенный проект), сложные сценарии откатов, или вы предпочитаете декларативный подход.