PlayFramework
slick

playframeworkでslickを使ってDBにアクセする際にハマったのでメモ

More than 3 years have passed since last update.


概要

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の一部


application.conf

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



build.sbt

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の一部は以下のとおりになった。


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"
)


application.conf

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=""