我使用scala
slick
中使用了此代码
def insertTask(task: Task) = {
conn.dbObject withSession { implicit session: Session =>
tasks.insert(task)
}
}
看起来有效:)
现在我还要提供readTask
的代码,我不想复制withSession { implicit...
的代码
所以我想到了这样做:
def doWithConn(dbConn: DBConnection, doThisCodeBlock: => Unit)(implicit session: Session) = {
dbConn.dbObject withSession { implicit session: Session =>
doThisCodeBlock
}
}
现在我的代码看起来像
def insertTask(task: Task) = {
doWithConn(conn, tasks.insert(task)) // here i get the following complication error
}
但是我收到以下编译错误:
错误:(36,34)找不到参数会话的隐含值:scala.slick.jdbc.JdbcBackend #SessionDef doWithConn(conn,tasks.insert(task)) ^
我不确定如何从session
方法传递insertTask
。如何传递它并修复此编译错误?
感谢
答案 0 :(得分:2)
withSession是一个方法,它将会话中的函数作为参数。 syntax { implicit session => }
只是为了隐藏会话。但你也可以传递一个函数:
val yourBlock: Session => ... = ...
db.withSession(yourBlock)
无需包装它,只需按原样使用它:)。
克里斯
答案 1 :(得分:0)
我认为问题是你的doThisCodeBlock
没有传递会话的概念。我认为更好的方法是简单地使用currying来重用使用会话的语句:
def insertTaskStatement(task: Task)(implicit session: Session) = {
tasks.insert(task)
}
def insertOtherThingStatement(otherThing: OtherThing)(implicit session: Session) = {
things.insert(otherThing)
}
def insertTaskAndOtherThing(task: Task,otherThing: OtherThing) = {
conn.dbObject withSession { implicit session: Session =>
insertTaskStatement(task)
insertOtherThingStatement(otherThing)
}
}