В чем разница между Flyway и Liquibase как инструментами миграции базы данных?

«В чем разница между Flyway и Liquibase как инструментами миграции базы данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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: Если нужна независимость от СУБД (мультиплатформенный проект), сложные сценарии откатов, или вы предпочитаете декларативный подход.