nFact

n!

Play Framework Evolutionsでファイル名を1.sql, 2.sql...以外にする

やりたいこと

Play Frameworkで用意されているDBマイグレーションツールにEvolutionsがあるが、ファイル名が連番でしか指定できず、後から見たときに何をやっているのかが分かりづらいなどの問題がある。 これを、下記のようにファイル名を指定できるようにしたい。

conf/evolutions/default
  1_create_table_users.sql
  2_create_table_roles.sql
  ...

ほとんど全く同じ事をする記事で下記の記事があったが、もっと簡単に出来たのでこの記事に残しておく。

コード

package modules

import java.io.{FileInputStream, InputStream}

import javax.inject._
import play.api.Environment
import play.api.db.evolutions._
import play.api.inject._

class EvolutionsModule extends SimpleModule(
  bind[EvolutionsConfig].toProvider[DefaultEvolutionsConfigParser],
  bind[EvolutionsReader].to[CustomEvolutionsReader],
  bind[EvolutionsApi].to[DefaultEvolutionsApi],
  bind[ApplicationEvolutions].toProvider[ApplicationEvolutionsProvider]
)

@Singleton
class CustomEvolutionsReader @Inject()(environment: Environment) extends ResourceEvolutionsReader {
  override def loadResource(db: String, revision: Int): Option[InputStream] = {
    val evolutionDirectory = environment.getFile(Evolutions.directoryName(db))
    evolutionDirectory.listFiles()
      .find(f => f.getName.endsWith(".sql") && f.getName.startsWith(s"${revision}_"))
      .map(new FileInputStream(_))
  }
}

さらに、元記事同様に application.conf に下記を追記する。

play.modules {
  enabled += "modules.EvolutionsModule"
  disabled += "play.api.db.evolutions.EvolutionsModule"
}

リロードすると連番SQL以外でもマイグレーションが適用される。

参考にしたサイト