flywayで環境(開発・テスト・本番)ごとにデータベースの接続先を切り替える

このブログは個人の調査および見解によって書いたものです。実際に以下の内容を使われる場合は自己責任でお願いします。

flywayとは

flywayはJavaでデータベースのマイグレーションを行うためのツールです。

http://flywaydb.org/

JavaでWEBアプリケーションを作っていて、Ruby On Railsのようにスキーママイグレーションを実行したいと思って、Googleで探したところヒットしたので使ってみました。

前提条件

ソフトウェア バージョン
Gradle 1.9
flyway 3.0
MySQL 5.1.73

実行方法(基本編)

ちなみに、flywayをGradleで使う方法はドキュメント(http://flywaydb.org/documentation/gradle/)に書いてあります。

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.flywaydb:flyway-gradle-plugin:3.0'
    }
}
flyway {
  url      = 'jdbc:mysql://localhost:3306/example'
  user     = 'app_user'
  password = 's3cret'
}

src/main/resources/db/migrateにSQLスクリプトを配置します。 SQLファイルには命名規則があり、先頭大文字Vで始まり、バージョン、(アンダースコア)2つ、説明と続きます。 バージョンと説明は(アンダースコア)または.(ドット)で区切ることが可能です。

V0.0.1__create_todo.sql

create table todo(
   id           INTEGER      NOT NULL AUTO_INCREMENT
  ,title        VARCHAR(30)
  ,description  TEXT
  ,PRIMARY KEY (id)
)

Gradleの実行

./gradlew flywayInit

上記タスクを実行すると、スキーマにschema_versionテーブルが作成されます。 このテーブルがマイグレーションをどこまで実行しているかを保持します。

./gradlew flywayMigrate

上記タスクでマイグレーションが実行されます。

環境ごとにデータベースの接続先を分ける場合

ちなみに、正しいアプローチなのかは不明です。こういうツールの場合は、すでにこのような機能が実装されていることを期待していたのですが、今の時点では機能が見つかっていないため、以下の実装にしました。

build.gradle

flyway {

    def enviroment = 'development'

    switch(enviroment) {
        case "development" :
            url      = 'jdbc:mysql://localhost:3306/example_development'
            user     = 'app_user_development'
            password = 'development_s3cret'

        case "test" :
            url      = 'jdbc:mysql://test-database:3306/example_test'
            user     = 'app_user_test'
            password = 'test_s3cret'

        case "production" :
            url      = 'jdbc:mysql://database:3306/example_production'
            user     = 'app_user'
            password = 'producition_s3cret'

        default :
            //Same development
            url      = 'jdbc:mysql://localhost:3306/example_development'
            user     = 'app_user_development'
            password = 's3cret'
    }
}

以下の方法で実行します。

./gradlew flywayMigrate -Pflyway.enviroment=production

flywayは Gradleタスクに-Pを付与することで、実行時にプロパティを指定できます。

以上です。