我使用的是光滑的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,但尝试不能失败。我该如何解决这个问题?
使用DBIOAction#asTry
将DBIOAction[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) => ...
}