Как стать автором
Обновить

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

Время на прочтение 3 мин
Количество просмотров 6.2K

В данной заметке я покажу, как запускать 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 предлагает простой и надёжный способ ставить изменения в БД. И они прекрасно сработались.



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


Теги:
Хабы:
+12
Комментарии 7
Комментарии Комментарии 7

Публикации

Истории

Работа

Java разработчик
342 вакансии

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн