Какие инструменты миграции схемы БД вы использовали и в чем их преимущества?

Ответ

Основные инструменты: 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:

  1. Идемпотентность: Миграции должны быть безопасны для многократного выполнения.
  2. Тестирование: Обязательно тестировать миграции на staging-окружении, особенно откаты.
  3. Не изменять примененные миграции: Если скрипт уже выполнен в продакшене, создавайте новую миграцию для изменений.

Ответ 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: Все скрипты лежат в гите вместе с кодом. Видно, кто что менял и когда.

Ну и главные правила, чтобы не обосраться:

  1. Идемпотентность — святое. Твоя миграция должна быть безопасной при повторном запуске. Добавляешь колонку? Сначала проверь, есть ли она уже. IF NOT EXISTS — твой лучший друг.
  2. Тестируй, ёпта! Особенно откаты. Выкатил на staging — проверь, что накатывается и откатывается без пиздеца. Иначе в проде будет «ой, а чё это всё сломалось?».
  3. Не лезь в прошлое. Если миграция уже улетела в продакшен — руки прочь! Не редактируй старый скрипт. Создай новую миграцию с исправлением. Иначе в следующий раз Flyway или Liquibase просто охуеют и откажутся работать.

Вот и весь сказ. Выбирай, что ближе по душе — SQL или XML, и живи спокойно. А то без этого — один сплошной «в рот меня чих-пых» на ровном месте.