Play Framework2.0 いじってみる。
https://github.com/playframework/Play20/wiki
このへんのチュートリアルに沿ってインストールはできると。
SBT ベースになってるので、そのままいけるかなーと思ったけど、コレが案外ハマった。
まず、SBT-Idea突っ込もうとして、「project/plugins.sbt」に
resolvers ++= Seq(
DefaultMavenRepository,
Resolver.url("Play", url("http://download.playframework.org/ivy-releases/"))(Resolver.ivyStylePatterns),
"Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/",
"sbt-idea-repo" at "http://mpeltonen.github.com/maven/"
)
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "0.11.0")
libraryDependencies ++= Seq("play" %% "play" % "2.0-beta")としたまでは良かった。
問題は、依存ライブラリの設定だった。
ここで libraryDependencies にいくら設定しても入らない謎現象に悩まされた。というか、書くと本来取って欲しいURLとは違うURL参照して、依存を解決できないとかビルドエラーを起こす。
結果から言うと、「project/Build.scala」に書くのが正しいらしく、
val appDependencies = Seq(
// Add your project dependencies here,
"postgresql" % "postgresql" % "9.0-801.jdbc4",
"org.squeryl" %% "squeryl" % "0.9.5-RC1"
)と書いて何とか入った。SBTの仕様なのか、、、、よくわからん。
後、使い慣れた squeryl 使いたい。
極論言ってしまえば、java.sql.Connection インスタンスさえ引っこ抜ければSquerylでも全く問題なく使える。 http://www.7sudos.com/blog/scalatra-mysql-and-star-wars-droids
PlayFramework2.0 のデフォルトDBライブラリは scalaquery で、「play.api.db.DB」で設定の読み込み→コネクションの取得までやっている。
https://github.com/playframework/Play20/tree/master/framework/src/play/src/main/scala/play/api/db
でソースを眺めると、DB.getConnection で拾ってこれそう。
なので、Squeryl 的にはコネクションプールから拾ってくる感覚でコレ呼べばいいのかなってコトで、
package models
import play.api.db.DB
import play.api.Play.current
import org.squeryl.{Session => SqSession}
import org.squeryl.SessionFactory
import org.squeryl.adapters.PostgreSqlAdapter
trait DatabaseInitializer {
def initDatabase = {
SessionFactory.concreteFactory = Some(() => connection)
def connection = {
SqSession.create(DB.getConnection(autocommit = false), new PostgreSqlAdapter)
}
}
}
trait ConnectionSupport {
def withConnection[T](f: => T):T = {
val session = SqSession.currentSession
session.bindToCurrentThread
try {
f
} finally {
session.close
session.unbindFromCurrentThread
}
}
}アダプタのインスタンスは設定引っこ抜いて作れば動的にできる(と思う)けど、今作ってるクランサイトは Postgresql オンリーなのでコレでいいやと放置。
なにげに「import play.api.Play.current」忘れると動かないので注意が必要。
てーか initDatabase はコントローラオブジェクトで必ず呼ぶんだから、Controller 継承して $init$ でやっとけって話かもしれない。