Вместо предисловия


Статья будет интересна тем, кто хоть раз задумывался о вопросе наката изменений (патча) на реляционную БД. Статья не будет интересна тем, кто уже освоил и использует Liquibase. Главной целью данной статьи является указание ссылки на репозиторий с примером использования. В качестве примера я выбрал накат sample-схемы HR на БД Oracle (список всех поддерживаемых БД) — любой желающий может скачать себе репозиторий и поиграться в домашних условиях. Желание продемонстрировать пример вызвано обсуждением этого вопроса на ресурсе sql.ru.


Что такое Liquibase


Что такое Liquibase, можно узнать на официальном сайте продукта. Хочется отметить пару хороших статей и на этом ресурсе:
Управление миграциями БД с Liquibase
Использование Liquibase без головной боли. 10 советов из опыта реальной разработки


Почему я использую Liquibase


Мой выбор остановился на этом инструменте, так как:


1) Инструмент отслеживает, какие changeset-ы уже были применены к данному экземпляру БД и накатывает только те, которые еще не накатывались и какие нужно еще донакатить. Если в процессе наката применение какого-либо изменения упало с ошибкой, то, после устранения причины вы перезапускаете накат и Liquibase продолжает выполнение с того changeset-а, на котором остановился.


2) Возможность выставить changeset-у атрибуты runOnChange и runAlways существенно упрощает управление изменениями, в частности, recreatable-объектов.


3) Свойство context позволяет выполнять/не выполнять changeset-ы в зависимости от текущего окружения (например, не запускать юнит-тесты на проде).


Это был не полный список фич.


Репозиторий


Он здесь. В нем приведены "hard" (таблицы, индексы, ограничения целостности) и "soft" (триггеры, процедуры, представления) объекты, changeset-ы с тегами sql и sqlFile, c атрибутами runOnChange и runAlways и без.


Чего нет в репозитории


Ввиду отсутствия необходимости в репозитории нет таких полезных фич/шагов, которые я обычно использую в своих проектах:


  • Preconditions — позволяют задавать условие выполнения changeset-a;
  • Компилирование объектов схемы в конце наката. В Oracle это dbms_utility.compile_schema(user, false);
  • Запуск юнит-тестов.

Комментарии (33)


  1. debose
    01.10.2017 22:13

    Пару недель назад внедрял миграции для баз данных. Смотрел на Liquidbase и flywaydb. Выбрали 2й, потому что он понятнее — работает с sql скриптами а не абстракциями. Но даже несмотря на всю простоту, внедрение в команде идёт со скрипом. Пару недель был переходный период когда можно было писать скрипты и для ручного запуска и для автоматического. Команда всё равно выбирала привычный ручной способ. Хотя, вся разница была в том как назвать скрипт и куда положить. Ну и небольшой howto нужно было прочитать.


    1. debose
      01.10.2017 22:15

      Я это к тому, что для того чтобы освоиться с liquibase придётся потратить больше времени.


      1. akk0rd87 Автор
        01.10.2017 23:31

        А функционал не сравнивали?


        1. SnowBearRu
          02.10.2017 14:49

          Вот здесь есть по использованию
          stackoverflow.com/questions/37385823/liquibase-vs-flyway-which-one-to-use


          1. akk0rd87 Автор
            02.10.2017 14:49

            Благодарю.


        1. debose
          02.10.2017 18:21

          С Liquibase я работал пару лет назад. Liquibase мощнее, но и сложнее в освоении.
          Из преимуществ Liquibase (о которых я знаю):


          • независим от базы/диалекта
          • умеет dry-run. Т.е. можно посмотреть какие sql-ы будут сгенерированы
          • умеет rollback (при условии, что описаны сценарии для rollback-а)
            Из минусов:
          • сложнее в освоении, настройке
          • формат описания changeset-ов — xml. У меня был опыт — когда все changeset-ы были описаны в одном большом файле. Разруливать merge конфликты, конфликты версий при работе в большой распределённой команде было сомнительным удовольствием.


          1. akk0rd87 Автор
            02.10.2017 21:28

            Ну то, что ты все changeset-ы в один файл пихал — это ты конечно сам себе злобный Буратино. Ну а уж если, как тут говорят, Liquibase сложнее в освоении, то в сравнении с FlyWay стоит сказать именно так: тяжело в учении, но легко в бою.


            1. debose
              03.10.2017 00:37

              Не все так однозначно. Но вводить liquibase в команду даже из 10 человек я не рискнул бы без острой необходимости именно в liquibase-овских фишках.


              1. akk0rd87 Автор
                03.10.2017 10:17

                И какую бы альтернативу автоматическому накату изменений ты бы выбрал?


                1. debose
                  03.10.2017 13:13

                  Я же писал. Flyway я выбрал.


                  1. akk0rd87 Автор
                    03.10.2017 15:34

                    Что будешь делать, если накат упадет на середине выполнения SQL-файла?


                    1. debose
                      04.10.2017 01:15

                      Править скрипт, просить команду быть внимательнее. А если такое будет часто, то писать более гранулярные скрипты. Что тут ещё можно сделать?


                      1. akk0rd87 Автор
                        04.10.2017 08:30

                        Это понятно. После того, как ты устранишь причину падения — ты будешь вынужден либо руками удалить из файла уже выполнившиеся команды/операторы, либо запускать руками оставшуюся часть. В случае с Liquibase ты просто нажал бы повторно кнопочку наката.


      1. SyrexS
        02.10.2017 11:02

        Не смотрели в сторону dbDeploy? Правда там только порядок выполнения и пропуск выполненных


        1. akk0rd87 Автор
          02.10.2017 15:03

          Нет, не смотрел.


        1. debose
          02.10.2017 18:14

          Последнее обновление от 2009 года. Я смотрел только на более менее живые проекты.


    1. akk0rd87 Автор
      01.10.2017 23:37

      SQL, обвернутый в xml-тег, это уже абстракция?


      1. debose
        02.10.2017 18:22
        -1

        Абстракция — это описание changeset-a в чистом xml. SQL обёрнутый в тэг — это не абстракция, это извращение. =)


        1. akk0rd87 Автор
          02.10.2017 18:28

          Для тех, кто не знает или боится SQL — возможно. Посмотри диаграмму ораколовой команды create table. При желании сделать что-то не предусмотренное xml-нотацией далеко не уедешь. Да и представь себе, я в changeset-ы не только SQL, но и PL/SQL вставляю. Тебе уже стало страшно?


          1. debose
            03.10.2017 00:25
            +1

            Я ничего не имею против SQLа. Sql-ы в отдельных файлах — на здоровье. А Sql-ы внутри xml тэгов я считаю извращением. Когда ты один пишешь, пиши как хочешь. Но когда так пишет целая команда, то разобраться в том, к чему этот sql был написан (особенно если это pl/sql) проще когда sql отдельно, а xml отдельно.


            1. akk0rd87 Автор
              03.10.2017 10:16

              Ну это твое субъективное мнение. А вот тебе мое: если мне нужно сделать десяток alter-ов, зачем я буду плодить столько же файлов, мне проще засунуть их в один xml-файл под разными changeset-ами.


            1. akk0rd87 Автор
              03.10.2017 10:22

              Ты хочешь сказать, тебе будет легче разобраться, для чего нужен был конкретный SQL, если он будет в отдельном файле, а не в XML-теге?


              1. debose
                03.10.2017 13:16

                Зависит от SQL-a. Если это однострочник типа ALTER TABLE ADD COLUMN — то всё-равно. Если же что-то типа CREATE TABLE, то лучше бы ему быть в отдельном файле.


        1. akk0rd87 Автор
          02.10.2017 18:44

          Как прикажешь делать insert-ы, сложные update/merge?


    1. alek_sys
      02.10.2017 10:04
      +3

      Преимущества абстракций liquibase это:


      • независимость (теоретически) от базы, liquibase генерит нужный sql код для конкретной базы. "Теоретическая" — потому, что такого требования часто нет, да и периодически все равно требуется что-то делать чистым sql, что уже ломает автоматическую совместимость
      • возможность автоматического rollback, для большинство вещей типа создания таблиц, ключей и т.п. liquibase может автоматически создать "обратную" операцию и откатить изменения. Не то, чтобы их сложно было написать в SQL, но все же


      1. akk0rd87 Автор
        02.10.2017 10:06
        +1

        + Liquibase в отличие от того же Flyway ведет трекинг в бд не по файлам, а отдельным changeset-ам со всеми вытекающими преимуществами.


        1. debose
          03.10.2017 00:41

          У flyway даже комментарий в скрипт добавить нельзя после запуска.


  1. Roms
    01.10.2017 23:27
    +6

    Простите, а где статья-то?


    1. akk0rd87 Автор
      01.10.2017 23:28
      -1

      Какую статью Вы ждете?


  1. andreylartsev
    02.10.2017 11:05

    Работает ли инструмент с данными или только со схемой? Если работает с данными то каким образом решается такая проблема что данные в различных окружениях (например в продуктовом и тестовом) должны отличатся?


    1. akk0rd87 Автор
      02.10.2017 11:42

      Да, данные на тесте и проде могут отличаться. А в чем проблема? Сформулируйте.


    1. digrabok
      02.10.2017 14:49
      +1

      Работает,
      просто создаете sql файлы с данными и запускаете их.


      Как вы организуете эти файлы под разные энвайронменты — это уже на что фантазии хватит.
      Можно просто разные наборы данных иметь, а можно для test подготовить sql который будет править/расширять dev данные.


      1. akk0rd87 Автор
        02.10.2017 14:50

        Совершенно верно.