Gymterview
middle

Как использовать Liquibase для генерации changelog из существующей БД?

Команда generateChangeLog создаёт changelog на основе текущей структуры БД. Это основной способ внедрения Liquibase в уже существующий проект.

Генерация через командную строку

Пример
liquibase --url=jdbc:postgresql://localhost:5432/mydb \
          --username=admin \
          --password=secret \
          generateChangeLog \
          --changelog-file=db/changelog/generated-changelog.xml

Генерация через Maven

Пример
mvn liquibase:generateChangeLog

Что генерируется

  • Таблицы и столбцы
  • Первичные ключи
  • Внешние ключи
  • Уникальные ограничения
  • Индексы
  • Представления (views)
  • Последовательности (sequences)

Что НЕ генерируется

  • Хранимые процедуры и функции
  • Триггеры
  • Данные в таблицах (для этого используется отдельная опция --diffTypes=data)

Команда diff

Сравнение двух БД:

Пример
liquibase --url=jdbc:postgresql://localhost:5432/dev_db \
          --username=admin \
          --password=secret \
          diff \
          --referenceUrl=jdbc:postgresql://localhost:5432/prod_db \
          --referenceUsername=admin \
          --referencePassword=secret

diffChangeLog

Генерация changelog с различиями между двумя БД:

Пример команды diffChangeLog
liquibase --url=jdbc:postgresql://localhost:5432/dev_db \
          --username=admin \
          --password=secret \
          diffChangeLog \
          --referenceUrl=jdbc:postgresql://localhost:5432/prod_db \
          --referenceUsername=admin \
          --referencePassword=secret \
          --changelog-file=diff-changelog.xml

Типичный сценарий внедрения Liquibase в существующий проект

  1. Сгенерировать changelog из production БД:

    Пример
    liquibase generateChangeLog --changelog-file=initial-schema.xml
    
  2. Проверить и отредактировать сгенерированный changelog

  3. Применить changelog с changeLogSync (отметить все changeset-ы как выполненные без реального применения):

    Пример
    liquibase changeLogSync
    
  4. С этого момента все новые изменения добавляются через обычные changeset-ы

Сгенерированный changelog следует рассматривать как отправную точку — его нужно просмотреть, подчистить и при необходимости переструктурировать.

На собеседовании: интервьюер часто спрашивает: «как внедрить Liquibase в проект, где БД уже существует?» Ключевой момент — не забыть про changeLogSync, иначе Liquibase попытается создать уже существующие таблицы. Частая ошибка — не упомянуть ограничения generateChangeLog (не генерирует процедуры и триггеры).