【问题标题】:Slick with Play: db update from outside a Controller DBActionSlick with Play:从控制器 DBAction 外部更新数据库
【发布时间】:2014-05-07 16:18:12
【问题描述】:

我有一个 Play 应用程序,我在其中使用 Slick 处理数据库通信。

到目前为止一切顺利,但我有以下问题:我有一个 Akka Actor,它与远程系统通信,从这些系统获取数据,并且必须使用这些数据更新数据库。

现在,我在模型中有一些更新数据库的方法,但它们需要一个隐式会话参数:如果对这些方法的调用来自控制器操作,因为它们是 DBAction,它们会自动处理会话,但如果我想从控制器外部(即从那些参与者)调用这些方法,我应该创建自己的会话(使用 Database.fromURL)吗?它会干扰控制器自动创建和处理的那个吗?

【问题讨论】:

  • 如果您不从控制器调用该方法,您可以简单地使用DB.withSession { implicit s: Session => { /* some computation */ } },这应该可以弥补缺少的DBAction,至于 Slick 文档(我在时刻)此会话将自动关闭。
  • 找到它here

标签: scala playframework akka actor slick


【解决方案1】:

很好奇并进行了一些挖掘,DBAction 类扩展了具有 apply 方法的 CurrentDBAction 特征:

def apply[A](dbName: String, bodyParser: BodyParser[A] = anyContent)(requestHandler: DBSessionRequest[A] => SimpleResult)(implicit app: Application = null) = {
  val current = db(dbName, Option(app))
  applyForDB(current)(requestHandler)(bodyParser)(current.withSession)(errorPage)
}

基本上它所做的是创建一个DB 对象并将它与withSession 一起传递给applyForDB 函数(应该是因为我不是专家并且源代码不是那么容易阅读)和这样做完全一样

DB.withSession {
  implicit session: Session => {
    /* some computation */
  }
}

代码可以在here找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多