【问题标题】:Update a row only if condition is met仅在满足条件时才更新行
【发布时间】:2016-07-09 12:25:34
【问题描述】:

仅当行具有有效数据时,我才想更新行中的某个列。具体一点:我有一张带有Event 的表,其中存储了startstopisActive 标志。 我想通过将isActive 设置为true 来激活一些Events,但是我需要检查开始日期和结束日期是否有效。 型号:

 case class Event {start:DateTime, stop:DateTime, isActive:Boolean}

我的验证方法签名:

validateEvent(ev: Event): Boolean

我的第一种方法:

def activateEv() = Action.async(parse.json) { request => { ... val ev = db.run(dao.findEvById(poid, uid)) val ret = ev.flatMap { case st: Option[Event] => if (validateEvent(st.get)) { db.run(dao.updateActivity(poid, true).map { case 0 => false case other => true } } else Future(false) } ... } }

我认为这不是解决这个问题的方式。 你能建议吗? 也许只有一个 db.run 就足够了?

【问题讨论】:

    标签: scala playframework slick slick-3.0


    【解决方案1】:

    这可以通过在 DBIOAction 对象上使用组合符(例如 flatMap)在单个 db.run 中实现。假设您的 dao 方法如下所示:

    case object dao {
      def findEvById(poid: Int, uid: Int): DBIOAction[Option[Event], NoStream, Effect.Read] = ???
    
      // In your case `updateActivity` returns an `Int` and you're mapping it to a `Boolean`.
      // That mapping could be placed here, so `updateActivity` would return `Boolean` now.
      def updateActivity(poid: Int, bool: Boolean): DBIOAction[Boolean, NoStream, Effect.Write] = ???
    }
    

    这就是我们可以实现您正在寻找的东西的方式:

    ...
    val action = dao.findEvById(poid, uid).flatMap {
      case Some(event) if validateEvent(event) => dao.updateActivity(poid, true)
      case _ => DBIO.successful(false)
    }.transactionally
    
    db.run(action)
    ...
    

    如您所见,我们在这里有一个事务,它将进行选择,然后进行更新(仅当event 有效时)。此外,整个select then update 操作可能是您的dao 中的一个单独方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-22
      • 2020-01-10
      • 2013-01-31
      • 2011-05-13
      • 2013-06-11
      • 1970-01-01
      • 2018-06-26
      • 2021-08-25
      相关资源
      最近更新 更多