Пользователь
0,0
рейтинг
29 сентября 2012 в 02:21

Разработка → Как запускать DBDeploy в Gradle tutorial

SQL*, JAVA*

В данной заметке я покажу, как запускать DBDeploy из скрипта Gradle.


О чём это вообще?


Возможно, вы уже слышали о версионированной миграции структуры баз данных. Об этом писали на хабре. DBDeploy — один из самых простых и известных инструментов, позволяющий легко установить все последние изменения в базе данных на любом инстансе и любой девелоперской машине. А Gradle — модный ныне инструмент для сборки проекта (как Ant и Maven, только лучше). О нём тоже уже писали.


И в чём вопрос?


Вопрос в том, как запускать DBDeploy из скрипта Gradle? У DBDeploy есть таски для Ant и плагин для Maven, но пока ещё нет плагина для DBdeploy (точнее, он в зачаточном состоянии). Немного потыркавшись, я пришёл к выводу, что самый простой способ — это использовать тот самый Ant таск DBDeploy из скрипта Gradle (здесь описано, как из gradle-скрипта использовать любые Ant-таски). Рассмотрим пример.



Задача ясна, с чего начнём?


Допустим, наш проект имеет следующую структуру. В папке «db» хранятся SQL-скрипты:


  • db
    • create_changelog_table.sql
    • 001_create_customer_table.sql
    • 002_create_address_table.sql
    • 003_etc...

  • build.gradle


Тогда мы можем создать Gradle-скрипт с 3 тасками:

build.gradle


project.ext {
  dbDriver = 'com.mysql.jdbc.Driver'
  dbUrl = 'jdbc:mysql:///habrahabr'
  dbUsername = 'habra'
  dbPassword = 'habr'
}


task updateDatabase

task updateDatabase << {
  ant.taskdef(name: 'dbdeploy', 
              classname: 'com.dbdeploy.AntTarget', 
              classpath: configurations.compile.asPath)

  ant.dbdeploy(driver: dbDriver,
    url: dbUrl,
    userid: dbUsername, 
    password: dbPassword, 
    dir: 'db',
    dbms: 'mysql',
    undooutputfile: 'db/undo_last_change.sql')
}


task createChangelogTable

<b>task createChangelogTable</b> << {
  ant.sql(driver: dbDriver, 
          url: dbUrl, 
          userid: dbUsername,
          password: dbPassword,
          encoding: 'UTF-8',
          classpath: configurations.compile.asPath) {
      fileset(file: 'db/create_changelog_table.sql')
  }
}


task undoLastChange

<b>task undoLastChange</b> << {
  ant.sql(driver: dbDriver,
          url: dbUrl,
          userid: dbUsername,
          password: dbPassword,
          encoding: 'UTF-8',
          classpath: configurations.compile.asPath) {
      fileset(file: 'db/undo_last_change.sql')
  }
}


Как это запускать?


Таким образом у нас появилось 3 таска:

> gradle createChangelogTable
:createChangelogTable
BUILD SUCCESSFUL

> gradle updateDatabase
[ant:dbdeploy] dbdeploy 3.0M3
[ant:dbdeploy] Reading change scripts from directory /tmp/habr/gradle-dbdeploy/db...
[ant:dbdeploy] Changes currently applied to database:
[ant:dbdeploy]   1..61
[ant:dbdeploy] Scripts available:
[ant:dbdeploy]   62..62
[ant:dbdeploy] To be applied:
[ant:dbdeploy]   62..62
[ant:dbdeploy] Applying #62: 062_migrate_currency_to_eur.sql...
[ant:dbdeploy]  -> statement 1 of 5...
[ant:dbdeploy]  -> statement 2 of 5...
[ant:dbdeploy]  -> statement 3 of 5...
[ant:dbdeploy]  -> statement 4 of 5...
[ant:dbdeploy]  -> statement 5 of 5...
[ant:dbdeploy] Generating undo scripts...

BUILD SUCCESSFUL

> gradle undoLastChange
:undoLastChange
BUILD SUCCESSFUL

Теперь вы можете, один раз запустив «gradle createChangelogTable», запускать «gradle updateDatabase» каждый раз хоть после каждого изменения скриптов, а для отмены последних изменений использовать «gradle undoLastChange».

Подведём итоги


Gradle предоставляет очень лаконичный и читабельный синтаксис для билд-скриптов, DBDeploy предлагает простой и надёжный способ ставить изменения в БД. И они прекрасно сработались.

Удачного БДения!

Андрей Солнцев @asolntsev
карма
98,0
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • 0
    Вот только не понятно как деплоить бд в прод — на выходе у нас уже собранный артефакт без всяких gradle скриптов.
  • 0
    Тут есть несколько вариантов.
    А как у вас сейчас это делается?
  • 0
    Я для наведения порядка в базе использовал: dbmaintain library
    Она очень хорошо подходит для крупных проектов с множеством баз данных, условиями выполнения и т.д.

    Мне не хватало для счастья preprocessing phase, поэтому форкнул проект и дописал. Можно взять тут, ветка «preprocessing».

    Остался доволен, надеюсь кому-нибудь пригодится.
    • 0
      ПС. Такие вещи удобно встраивать в приложение. Оно становится более самостоятельным и легче автоматизируется
      • 0
        Иногда удобно, а иногда неудобно или невозможно.
        Например, есть компании, где базу и приложения администрируют разные админы, и они ни в какую не соглашаются меняться ролями. Также есть базы, в которых живут своей жизнью отдельные приложения (составленные из Pl/Sql, job и триггеров). И надо их ставить независимо от приложения.

        А когда база служит толко приложению и меняется вместе с ним — тогда действительно удобно запускать обновления базы прямо из приложения при старте.
        • 0
          Администрировать базу — это одно, а обновить базу до состояния, которое необходимо приложению — это другое.
          Почти каждый раз, когда выходит билд по приложению в readme.txt можно увидеть «выполните вот эту пачку скриптов».
          Туда входят и вставка/удаление данных, тригера, процедуры, пакеты, вьюхи и т.д.
          Когда это не автоматизировано, постановка нового билда может превратится в ад на 8 и более часов.
          Какие скрипты нужно выполнить? Какие не нужно? Какая версия приложения? Какой билд по базе к нему подойдёт?

          Вещи намного упрощаются, когда app сам себя трекает. Админу только лишь нужно проследить, что миграция базы прошла без ошибок.
          • 0
            Это вы описываете, зачем вообще нужен DBDeploy и другие подобные тулы.
            Но для этого совсем не обязательно запускать скрипт из-под приложения. Можно и отдельно.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.