scala – 如何捕获重复的键值违例的slick postgres异常
发布时间:2020-12-16 09:13:54 所属栏目:安全 来源:网络整理
导读:我的表在我的 postgresql数据库中的一列上有一个唯一的索引. 我想知道如何在插入时捕获重复的关键异常: def save(user: User)(implicit session: Session): User = { val newId = (users returning users.map(_id) += user user.copy(id = newId)} 我的日志
我的表在我的
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中真正使用异常. 解决方法
您的保存方法应该可能返回与用户不同的东西,以指示出现故障的可能性.如果抛出唯一的异常是唯一的键,你真的只关心成功或失败(而不是失败的类型),一种方法是返回Option [User].
您可以使用一个简单的try / catch块,将成功保存到Some [User]和PSQLException成为无: 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..") } 你可以使用它,如选项: 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,u3)) => Ok(...) case Failure(...) => ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |