LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-29

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ドキュメント

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2