ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

flywayのmultiple databases migration の設定メモ

本家はこちら

flyway でdb migrateしているが、公式ドキュメントではmultiple schemaは記述の仕方でなんとかなるんだけど、DBが分かれた場合は、地道にタスクを書くしかないっぽくて、そんなの嫌なのでちょっとメモ。

全体構成

一旦こんな感じのディレクトリ構成にしてみる。

├── build.gradle
├── conf
│   ├── example-admin.conf
│   └── example.conf
└── src
    └── main
        └── resources
            ├── example
            │   └── migration
            │       ├── V201801060359__create_account_table.sql
            │       └── V201801070137__create_table.sql
            └── example-admin
                └── migration
                    ├── V201801060359__create_account_table.sql
                    └── V201801070137__create_table.sql

resourcesディレクト

SQLはsrc/main/resources配下にexampleとexample-adminの配下にマイグレーション用のSQLファイルがおいてある。

build.gradle

汚いけど、taskを動的生成する

build.gradle

repositories {
    jcenter()
}

plugins {
    id 'org.flywaydb.flyway' version '6.4.1'
        id 'java'
}

["example", "example-admin"].each { name ->
    task  "${name}FlywayMigrate" (type: org.flywaydb.gradle.task.FlywayMigrateTask) {
        configFiles = ["conf/${name}.conf"]
    }

    task "${name}FlywayBaseline"(type: org.flywaydb.gradle.task.FlywayBaselineTask) {
        configFiles = ["conf/${name}.conf"]
    }

    task  "${name}FlywayClean"(type: org.flywaydb.gradle.task.FlywayCleanTask) {
        configFiles = ["conf/${name}.conf"]
    }

    task  "${name}FlywayInfo"(type: org.flywaydb.gradle.task.FlywayInfoTask) {
        configFiles = ["conf/${name}.conf"]
    }
}

こんな感じで、タスクを動的生成するようにする

confディレクト

ここにはDBとスキーマの定義ファイルがおいてある confファイルはこんな感じ

conf/example.conf

flyway.url=jdbc:postgresql://localhost:5432/example
flyway.user=example
flyway.password=example
flyway.schemas=public
flyway.locations=filesystem:src/main/resources/example/migration

conf/example-admin.conf