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 にアクセスするインスタンスを取得していました。
object Main extends App {
val app = new GuiceApplicationBuilder().build
val db = DatabaseConfigProvider.get[JdbcProfile]("hoge")(app).db
// 以下省略
}
Slick は 通常 default
の設定を使用しますが、この処理では hoge
の設定にある DB に接続していました。
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
を使わず、インジェクションして使用してくださいとあったので、以下のコードに変更しました。
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 にアクセスするようになりました。
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ドキュメント