【问题标题】:How to reuse scala slick "withSession { implicit session: Session =>" code block如何重用scala slick“withSession {隐式会话:Session =>”代码块
【发布时间】:2014-12-17 22:44:10
【问题描述】:

我在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)) ^

我不确定如何从insertTask 方法传递session。我怎样才能通过它并修复这个编译错误?

谢谢

【问题讨论】:

  • 在您的doWithConn 方法中,您无需传入Session,而是将其创建到方法主体中。
  • @EndeNeu 我想我不明白(我删除了(implicit session: Session) 我仍然得到相同的编译错误,但不确定这是你的意思..)

标签: scala slick


【解决方案1】:

withSession 是一种将会话中的函数作为参数的方法。 syntax { implicit session => } 只是为了使会话隐式。但你也可以只传递一个函数:

val yourBlock: Session => ... = ...

db.withSession(yourBlock)

无需包装,直接使用即可:)。

克里斯

【讨论】:

  • 当我尝试定义如下内容时:“val insertTaskInternal : Session => Unit = tasks.insert(task)”我得到Error:(32, 59) not found: value task val insertTaskInternal : Session => Unit = tasks.insert(task) ^。 (它找不到任务的方法插入)当它封装在conn.dbObject withSession { implicit session: Session =>中时它工作正常
  • 尝试 .insert(task)(_) 将方法的第二个参数列表转换为函数参数。除此之外,我还需要查看完整的代码和完整的消息。
  • 有道理!我不擅长这个我在实现yourBlock 时仍然遇到问题我已经尝试过这样(如果yourBlock 是丢弃方案)val deleteSchemeFunc: (Session => Unit) = { s: Session => tasks.ddl.drop } 但我得到编译错误:Error:(49, 71) could not find implicit value for parameter session: scala.slick.jdbc.JdbcBackend#SessionDef val deleteSchemeFunc: (Session => Unit) = { s: Session => tasks.ddl.drop } ^
  • 好的,找到了答案! :) val deleteSchemeFunc: (Session => Unit) = { session: Session => tasks.ddl.drop(session) }
  • 应该等同于val deleteSchemeFunc = tasks.ddl.drop(_)
【解决方案2】:

我认为问题在于您的doThisCodeBlock 没有将会话传递给它的概念。我认为更好的方法是简单地使用柯里化来重用使用会话的语句:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2013-05-18
    • 2012-12-19
    相关资源
    最近更新 更多