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

问题描述 投票:0回答:1

我使用的是光滑的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,但尝试不能失败。我该如何解决这个问题?

postgresql scala slick
1个回答
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)        => ...
}
© www.soinside.com 2019 - 2024. All rights reserved.