Slick Try(查询(运行))始终返回成功

时间:2017-12-28 13:07:00

标签: postgresql scala slick

我使用的是光滑的3.2.1。我使用operatorId作为外键。

我的代码是那样的

def changeCommentStatus(changeRequest: StatusUpdateRequest(implicit ec: ExecutionContext): Future[Int] = {
    val changeStatusQuery = comments
      .filter(_.id inSetBind changeRequest.commentIds)
      .filter(_.status === changeRequest.prevStatus)
      .map(c => (c.operatorId, c.updatedAt, c.status))
      .update((Some(changeRequest.operatorId), Some(new Timestamp(System.currentTimeMillis())), changeRequest.status))
    db.run(changeStatusQuery)
  }
Try(changeCommentStatus(changeRequest)) match {
      case Success(response) => bla bla bla
      case Failure(f) => bla bla bla

我使用违反外键的operatorId,但尝试不能失败。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

使用DBIOAction#asTryDBIOAction[Int]转换为DBIOAction[Try[Int]],然后flatMap结果:

def changeCommentStatus(...): Future[Int] = {
  val changeStatusQuery = comments
    .filter(...)
    .filter(...)
    .map(...)
    .update(...)
    .asTry
    .flatMap {
      case Success(res) => DBIO.successful(res)
      case Failure(t)   => DBIO.failed(t)
    }

  db.run(changeStatusQuery)
}

然后,您可以通过以下方式对Future进行模式匹配:

changeCommentStatus(changeRequest).onComplete {
  case Success(response) => ...
  case Failure(t)        => ...
}