概要
playframeworkでslickを使ってDB(メモリ上)にアクセスする際にハマったのでメモ。
実際は、DBにアクセスするのにハマったというよりも、Injectさせようとしてハマったが正しい。
PlayFramework with scalaでDBにアクセスさせるため、いろいろ探しててslickってのがあると知ってそれを使ってみようと思った次第。
環境
version | |
---|---|
scala | 2.11.7 |
activator | 1.3.7 |
slick(play-slick) | 1.1.1 |
何が起きたか
とりあえず知っている知識とその辺りを説明してくださっているソースコードを読みながら写経してみた
play2.4.3 + slick 3.0備忘録
その時のapplication.confの一部とbuild.sbtの一部
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play;MODE=MYSQL"
db.default.username=sa
db.default.password=""
play.evolutions.enabled=true
libraryDependencies ++= Seq(
jdbc,
"commons-io" % "commons-io" % "2.4",
"com.typesafe.play" %% "play-slick" % "1.1.1",
"com.typesafe.play" %% "play-slick-evolutions" % "1.1.1"
)
そのまま実行すると、以下の様なエラーが出た。
CreationException: Unable to create injector, see the following errors:
調べてみたら
https://playframework.com/documentation/ja/2.4.x/PlaySlickFAQ
にremove the Play jdbcとあるのでbuild.sbtから消してみる。
次は、以下のエラーが出た。
ProvisionException: Unable to provision, see the following errors:
No implementation for play.api.db.slick.DatabaseConfigProvider was bound.
while locating play.api.db.slick.DatabaseConfigProvider
Injectがうまくいってないみたいです。って言われた。
もう少し調べてみる。
https://playframework.com/documentation/ja/2.4.x/PlaySlickMigrationGuide
どうやらdb.defaultは無視されるようだ。代わりにslick.dbs.defaultのようだ。
すると次には
Error in custom provider, java.lang.RuntimeException: driverClassName specified class 'org.h2.Driver' could not be loaded
ほう、とさっきのページを見ると、driverがないので追加しろということなので追加する。
以上修正して、起動するとevolutionができるということが言われたのでよかったよかっためでたしめでたし
最終的にapplication.confとbuild.sbtの一部は以下のとおりになった。
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-slick" % "1.1.1",
"com.typesafe.play" %% "play-slick-evolutions" % "1.1.1",
"com.h2database" % "h2" % "1.4.191"
)
slick.dbs.default.driver="slick.driver.H2Driver$"
slick.dbs.default.db.driver=org.h2.Driver
slick.dbs.default.db.url="jdbc:h2:mem:play;MODE=MYSQL"
slick.dbs.default.db.user=sa
slick.dbs.default.db.password=""