flywayで環境(開発・テスト・本番)ごとにデータベースの接続先を切り替える
このブログは個人の調査および見解によって書いたものです。実際に以下の内容を使われる場合は自己責任でお願いします。
flywayとは
flywayはJavaでデータベースのマイグレーションを行うためのツールです。
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を付与することで、実行時にプロパティを指定できます。
以上です。