Ответ
Основные инструменты: Flyway (подход на основе SQL) и Liquibase (подход на основе XML/YAML/JSON). Они управляют версионированием схемы базы данных.
Flyway (Императивный подход):
- Изменения описываются в чистом SQL.
- Скрипты именуются по версии (например,
V1__Create_user_table.sql,V2__Add_email_column.sql). - Пример интеграции с Spring Boot:
// application.properties spring.flyway.enabled=true spring.flyway.locations=classpath:db/migration
Liquibase (Декларативный подход):
- Изменения описываются в форматах XML, YAML или JSON (
changeset). - Поддерживает откат изменений (rollback) на уровне changeset.
- Пример changeset в XML:
<changeSet id="1" author="dev"> <createTable tableName="user"> <column name="id" type="bigint" autoIncrement="true"> <constraints primaryKey="true"/> </column> <column name="name" type="varchar(255)"/> </createTable> </changeSet>
Ключевые преимущества использования:
- Версионирование и повторяемость: Состояние БД четко привязано к версии приложения.
- Автоматизация: Интеграция в CI/CD пайплайн для автоматического применения миграций.
- Безопасность: Исключаются ручные правки БД на продакшене.
- Collaboration: Скрипты миграций хранятся в VCS вместе с кодом.
Best practices:
- Идемпотентность: Миграции должны быть безопасны для многократного выполнения.
- Тестирование: Обязательно тестировать миграции на staging-окружении, особенно откаты.
- Не изменять примененные миграции: Если скрипт уже выполнен в продакшене, создавайте новую миграцию для изменений.