【问题标题】:Slick Try(query(run)) always return successSlick Try(query(run)) 总是返回成功
【发布时间】:2017-12-28 13:07:00
【问题描述】:

我使用的是 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

我使用了违反外键但 Try 不能失败的 operatorId。我该如何解决?

【问题讨论】:

  • 没有看到任何与 postgres 相关的内容
  • 我添加是因为也存在名为 slick 的类似名称的 js 工具

标签: postgresql scala slick


【解决方案1】:

使用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)        => ...
}

【讨论】:

  • 它解决了我的问题。非常感谢:D
猜你喜欢
  • 2019-08-17
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多