Ответ
Основные инструменты: 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-окружении, особенно откаты.
- Не изменять примененные миграции: Если скрипт уже выполнен в продакшене, создавайте новую миграцию для изменений.
Ответ 18+ 🔞
А, ну это ж про миграции баз данных, классика! Сидишь такой, пишешь код, а потом бац — и схема БД отстала, как последний мамонт. И начинается: «А кто в прод последний раз лазил?», «А почему у тебя работает, а у меня нет?». Пиздец, а не разработка.
Так вот, чтобы не было этих цирков с конями, есть два главных инструмента — Flyway и Liquibase. Они за тебя всё это безобразие и версионируют, и применяют.
Flyway — подход для прямых рукастых ребят, которые с SQL на «ты».
Тут всё просто, как три копейки: пишешь обычные 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
Включил — и он сам накатит всё по порядку, как по маслу. Никакой хуйни, чистый SQL. Хочешь добавить колонку — пишешь ALTER TABLE и не парься.
Liquibase — для тех, кто любит покомандовать декларативно.
Тут уже не SQL, а XML, YAML или JSON. Описываешь, что хочешь сделать, в этих changeset. Зато есть крутая фишка — можно прописать откат (rollback) на каждое изменение. Мало ли, накосячил — откатился.
Вот, смотри, как это выглядит в 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: Все скрипты лежат в гите вместе с кодом. Видно, кто что менял и когда.
Ну и главные правила, чтобы не обосраться:
- Идемпотентность — святое. Твоя миграция должна быть безопасной при повторном запуске. Добавляешь колонку? Сначала проверь, есть ли она уже.
IF NOT EXISTS— твой лучший друг. - Тестируй, ёпта! Особенно откаты. Выкатил на staging — проверь, что накатывается и откатывается без пиздеца. Иначе в проде будет «ой, а чё это всё сломалось?».
- Не лезь в прошлое. Если миграция уже улетела в продакшен — руки прочь! Не редактируй старый скрипт. Создай новую миграцию с исправлением. Иначе в следующий раз Flyway или Liquibase просто охуеют и откажутся работать.
Вот и весь сказ. Выбирай, что ближе по душе — SQL или XML, и живи спокойно. А то без этого — один сплошной «в рот меня чих-пых» на ровном месте.