Play flyway プラグインを作りました
https://github.com/tototoshi/play-flyway
Play にはもともと Evolutions というデータベースマイグレーション機能がついていますが、それと同じような機能を Flyway で作りました。
Flyway は Java 製のデータベースマイグレーションライブラリなんですが、Java でコードを書いたり、XML を使ったりではなく、Evolutions と同様に、Plain な SQL ファイルを使うのが基本です。
Motivation 1 (重要)
Play の Evolutions Plugin って実は DBPlugin に依存しているので、DBPlugin を使わない人にとってはちょっともどかしいところがあります。DBPlugin を使わない人ってのは例えば
- Mongo とか使ってる人
- Scalikejdbc の PlayPlugin など、DBPlugin に依存しない形で RDB を使っている人
などです。そういう人は不要でも Evolutions を使うためには DBPlugin を無効にできません。
さらに、Evolutions は実はインターフェースとしての DBPlugin と DBPlugin の実装である BoneCPPlugin の両方に依存しているため、
- Play の DBPlugin のインターフェースを継承した DBPlugin を自作した人
も Evolutions を使いたければ BoneCPPlugin をオフにできません。
というわけでなんでもいいから DBPlugin に依存しない Evolutions の代替が欲しかった。
Motivation 2
Evolutions は Ups と Downs 書きますが、DB マイグレーションの派閥には 「Downs いらないんじゃね? 派」もいるらしく Evolutions の feature request にもたしかそんなのがありました。あと Evolutions の場合は Ups と Downs を両方とも同じファイルに書くので怖い、という意見もあります。
Flyway は Ups のみで Downs はありません。これはまあ好みだと思います。
インストール
Build.scala/build.sbt に dependency を追加して
libraryDependencies += "com.github.tototoshi" %% "play-flyway" % "0.1.0"
play.plugins にこれを書く。
1000:com.github.tototoshi.play2.flyway.Plugin
使い方
SQL スクリプトの配置の仕方
conf/db/migration/${dbName} 以下に置いてください。
default なら conf/db/migration/default です。
ファイル名は flyway の規約に従って下さい。V1__create_nantoka_table.sql のようになります。詳しくは Flyway のドキュメントを見てください。
テスト
テスト時はマイグレーションは自動で適用されます。
Play 2 では h2 のインメモリデータベースを使っている人も多いかと思いますが、そのときは注意が必要です。インメモリデータベースは接続が切れるとデータが消えるので、それを防ぐために DB_CLOSE_DELAY=-1 を設定します。Play の inMemoryDatabase ヘルパーを使えば以下のようにして DB_CLOSE_DELAY オプションを設定できます。
running(FakeApplication( additionalConfiguration = inMemoryDatabase(name = "default", options = Map("DB_CLOSE_DELAY" -> "-1")) )) { test() }
ちなみにこのオプション指定機能をつけたのは私です。ドヤ
https://github.com/playframework/Play20/commit/f99b03d35f843c8e536435e6c597f8383c51dee0
まとめ
プルリクお待ちしております。