Как писать скрипты миграции в Liquibase?

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

Ответ

Liquibase — это инструмент для контроля версий и управления изменениями схемы базы данных. Скрипты (changeSets) можно писать в форматах XML, YAML, JSON или чистого SQL.

Ключевые концепции и элементы:

  • ChangeSet — атомарное, идемпотентное изменение (например, создание таблицы, добавление столбца). Выполняется только один раз для конкретной базы данных.
  • Preconditions — условия, которые проверяются перед выполнением changeSet.
  • Rollback — инструкции для отката изменений, описанных в changeSet.
  • DATABASECHANGELOG — служебная таблица, в которой Liquibase отслеживает выполненные изменения.

Пример changeSet в XML:

<changeSet id="create-users-table" author="dev">
    <createTable tableName="users">
        <column name="id" type="BIGINT" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="username" type="VARCHAR(50)">
            <constraints nullable="false"/>
        </column>
    </createTable>
    <rollback>
        <dropTable tableName="users"/>
    </rollback>
</changeSet>

Best Practices:

  1. Идемпотентность: Каждый changeSet должен быть написан так, чтобы его можно было выполнить безопасно много раз.
  2. Атомарность: Один changeSet — одна логическая операция.
  3. Поддержка разных СУБД: Используйте атрибут dbms для указания целевой базы данных (например, dbms="postgresql,mysql").
  4. Сложные миграции: Для массовых обновлений данных или сложной логики используйте тег <sqlFile> для подключения нативного SQL-скрипта, что обеспечивает большую гибкость и производительность.