4

Slick と Play2 Framework を使用して簡単なテスト アプリケーションを試していますが、コンパイラは暗黙的なセッションを推論できないと不平を言い続けます。

これが私のものBuild.scalaです:

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

  val appName         = "dummy"
  val appVersion      = "1.0"

  val appDependencies = Seq(
    jdbc,
    "mysql" % "mysql-connector-java" % "5.1.26",
    "com.typesafe.slick" %% "slick" % "1.0.1"
  )


  val main = play.Project(appName, appVersion, appDependencies).settings(
    // Add your own project settings here      
  )

}

これは、データベース接続を保持するグローバル シングルトンです。

package models

import play.api.Play.current
import play.api.db.DB
import slick.session.Session
import slick.driver.MySQLDriver.simple._
import scala.slick.session.Database.threadLocalSession


object Global {

  lazy val database = Database.forDataSource(DB.getDataSource())

  lazy val session = database.createSession()

}

そして私のコントローラー:

package controllers

import scala.language.implicitConversions
import play.api._
import play.api.mvc._
import models.Global.session

import slick.driver.MySQLDriver.simple._

object Application extends Controller {

  def index = Action {
    /*slick.driver.MySQLDriver.simple.*/Query(Foo).foreach( _ => () ) // Do nothing for now
    Ok(views.html.index("hola"))
  }

  object Foo extends Table[(Long, String, String)]("Foo") {
    def * = column[Long]("id") ~ column[String]("bar1") ~ column[String]("bar2")
  }

}

ご覧のとおり、私のGlobal.sessionval はインポートされていますが、暗黙のセッションが見つからないと言い続けています。

4

1 に答える 1

4

クエリを作成するには、データベースへの接続とセッションの 2 つが必要なので、問題はそれらをどのように定義して使用するかです。範囲内でDatabase.threadLocalSession、次のようなクエリを作成できます。

Database.forURL("jdbc:h2:mem:play", driver = "org.h2.Driver") withSession {
          //create table
          Foo.ddl.create
          //insert data
          Foo.insert((1.toLong,"foo","bar"))
          //get data
          val data : (Long,String,String) = (for{f<-Foo}yield(f)).first
}

または、次のようにすることもできます。

val database  = Database.forDataSource(DB.getDataSource())
 database.withSession{ implicit session : Session =>
          Foo.ddl.create
          Foo.insert((1.toLong,"foo","bar"))
          val data : (Long,String,String) = (for{f<-Foo}yield(f)).first
}

テストを作成しましたが、正常に動作します。それで遊ぶことができます:

"Foo should be creatable " in {
  running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
    val database  = Database.forDataSource(DB.getDataSource())
    database.withSession{ implicit session : Session =>
      Foo.ddl.create
      Foo.insert((1.toLong,"foo","bar"))
      val data : (Long,String,String) = (for{f<-Foo}yield(f)).first

      data._1 must equalTo(1)
    }
  }
}

また、あなたはここを見るかもしれません

于 2013-09-18T10:39:15.710 に答える