PlayFramework
slick

SlickのDatabaseConfigProviderでdefault以外の設定を使ってDBに接続するのでハマった

More than 1 year has passed since last update.

PlayFramework を 2.5.x から 2.6.x にバージョンアップした時に play-slick も 2.0.0 から 3.0.0 にバージョンアップしたところ deprecated の警告が出てしまいました。
その警告の修正にハマったので残しておきます。

play-slick 2.0.0の場合

Scala Object で DatabaseConfigProvider を使っていたので、DI ではなくDatabaseConfigProvider の get メソッドを使って DB にアクセスするインスタンスを取得していました。

main.scala
object Main extends App {
  val app = new GuiceApplicationBuilder().build
  val db = DatabaseConfigProvider.get[JdbcProfile]("hoge")(app).db
  // 以下省略
}

Slick は 通常 default の設定を使用しますが、この処理では hoge の設定にある DB に接続していました。

application.conf
slick.dbs {
  default {
    # 省略
  }
  hoge {
    # 省略
  }
}

play-slick 2.0.0 を使用しているときは上記のコードで hoge の設定にある DB に接続していました。

play-slick 3.0.0の場合

play-slick 2.0.0 のコードだと、以下の警告が出ました。
Use DatabaseConfigProvider#get[P] or SlickApi#dbConfig[P]("default") on injected instances

get を使わず、インジェクションして使用してくださいとあったので、以下のコードに変更しました。

Main.scala
object Main extends App {
  val app = new GuiceApplicationBuilder().build
  val dbConfig = app.injector.instanceOf[DatabaseConfigProvider]
  @NamedDatabase("hoge") val db = dbConfig.get[JdbcProfile].db
  // 以下省略
}

この場合、hoge の設定にあるDBに接続される想定でしたが、実際には default の設定にある DB に接続されてしまい、存在しないテーブルにクエリを発行しようとして例外がスローされました。

@NamedDatabase("hoge") が効いてなかったので、以下のコードに変更して動作を確認したところ hoge の設定にある DB にアクセスするようになりました。

Main.scala
object Main extends App {
  val app = new GuiceApplicationBuilder().build
  val executer = app.injector.instanceOf[Exetuter]
  executer.execute
  // 以下省略
}

class Exetuter @Inject() (@NamedDatabase("hoge") protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
  def execute = {
    // 省略
  }
}

参考

play-slick DatabaseConfigProvider github
PlaySlick 2.6.x 公式ドキュメント
play.api.inject.Injecter apiドキュメント