Как запускать DBDeploy в Gradle

в 22:21, , рубрики: database migrations, gradle, java, sql, Администрирование баз данных, метки: , ,

Как запускать DBDeploy в Gradle
В данной заметке я покажу, как запускать DBDeploy из скрипта Gradle.
Как запускать 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js