Play flyway プラグインを作りました

https://github.com/tototoshi/play-flyway

Play にはもともと Evolutions というデータベースマイグレーション機能がついていますが、それと同じような機能を Flyway で作りました。
Flyway は Java 製のデータベースマイグレーションライブラリなんですが、Java でコードを書いたり、XML を使ったりではなく、Evolutions と同様に、Plain な SQL ファイルを使うのが基本です。

http://flywaydb.org/

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 のドキュメントを見てください。

Dev

Evolutions と同じくこんな感じの画面が出てくるのでぽちっとしてください。


テスト

テスト時はマイグレーションは自動で適用されます。


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

Production

Production モードだとマイグレーションが必要な状態では起動できません。開発時のようにボタンを押してぼちっとかできないので。Evolutions と同じです。
db.${dbName}.migration.auto を application.conf で指定することでマイグレーションを適用できます。
あ、ちゃんとバックアップとかしてからにしてくださいね。

まとめ

プルリクお待ちしております。