gpt4 book ai didi

scala - 如何捕获重复键值违规的光滑 postgres 异常

转载 作者:行者123 更新时间:2023-12-04 00:01:41 24 4
gpt4 key购买 nike

我的表在我的 postgresql 数据库中的一对列上有一个唯一索引。

我想知道如何在插入时捕获重复的键异常:

def save(user: User)(implicit session: Session): User = {
val newId = (users returning users.map(_id) += user
user.copy(id = newId)
}

我的日志显示此异常:
Execution exception[[PSQLException: ERROR: duplicate key value violates unique constraint "...."

我也没有真正在 Scala 中使用过异常。

最佳答案

您的 save方法可能应该返回与 User 不同的东西, 表示失败的可能性。如果唯一会抛出的异常是唯一键,并且您真的只关心成功或失败(而不是失败的类型),那么一种方法是返回 Option[User] .

你可以使用一个简单的 try/catch块,映射成功保存到 Some[User]PSQLExceptionNone :

def save(user: User)(implicit session: Session): Option[User] = {
try {
val newId = (users returning users.map(_id) += user
Some(user.copy(id = newId))
} catch {
case PSQLException => None
}
}

个人不是我要走的路,如 try/catch不是真正惯用的 Scala,并且您的错误类型被丢弃。下一个选项是使用 scala.util.Try .
def save(user: User)(implicit session: Session): Try[User] = Try {
val newId = (users returning users.map(_id) += user
user.copy(id = newId)
}

这里的代码更简单。如果 Try的正文成功,则 save将返回 Success[User] ,否则将返回包裹在 Failure 中的异常.这将允许您使用 Try 做很多事情。 .

你可以模式匹配:
save(user) match {
case Success(user) => Ok(user)
case Failure(t: PSQLException) if(e.getSQLState == "23505") => InternalServerError("Some sort of unique key violation..")
case Failure(t: PSQLException) => InternalServerError("Some sort of psql error..")
case Failure(_) => InternalServerError("Something else happened.. it was bad..")
}

你可以像 Option 一样使用它:
save(user) map { user =>
Ok(user)
} getOrElse {
InternalServerError("Something terrible happened..")
}

您可以一次将多个组合在一起,并在第一次失败时停止:
(for {
u1 <- save(user1)
u2 <- save(user2)
u3 <- save(user3)
} yield {
(u1, u2, u3)
}) match {
case Success((u1, u2, u3)) => Ok(...)
case Failure(...) => ...
}

关于scala - 如何捕获重复键值违规的光滑 postgres 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com