ScalaおよびAnormでMayerer [IntegrityConstraintViolation、int]をどのように使用する必要がありますか?
-
27-10-2019 - |
質問
私が使う アナルム データベースクエリを実行します。私がするとき executeUpdate()
, 、適切なエラー処理を行うにはどうすればよいですか?返品タイプがあります MayErr[IntegrityConstraintViolation,Int]
, 、これはセットですか、それともマップですか?
あります 例, 、しかし、私は返品値をどのように処理すべきか理解していません:
val result = SQL("delete from City where id = 99").executeUpdate().fold(
e => "Oops, there was an error" ,
c => c + " rows were updated!"
)
クエリが失敗したかどうかを確認するにはどうすればよいですか? (使用 result
)、そしてクエリが成功した場合、影響を受ける行の数を取得するにはどうすればよいですか?
現時点では、このコードを使用しています。
SQL(
"""
INSERT INTO users (firstname, lastname) VALUES ({firstname}, {lastname})
"""
).on("firstname" -> user.firstName, "lastname" -> user.lastName)
.executeUpdate().fold(
e => "Oops, therw was an error",
c => c + " rows were updated!"
)
しかし、エラー処理コードがどのように見えるかはわかりません。タイプの返品値を使用する方法の例はありますか MayErr[IntegrityConstraintViolation,Int]
?
解決
あなたは明らかにすることができます
val updateResult = ....executeUpdate()
val success = updateResult.fold(e => false, c => true)
あなたも電話することができるようです
val success = updateResult.isRight
より一般的には、どちらかでラップされたものにアクセスできます
updateResult.e match {
case Left(error) => ... do something with error ...
case Right(updateCount) => ...do something with updateCount...
}
たぶん、プレイに精通している人は、なぜscala.はマイヤーに包まれているのかを説明するでしょうか?
他のヒント
それはように見えます MayErr
ラッピングです Either
. 。どちらでもありません Map
a Set
, 、むしろ、タイプされた2つのオブジェクトのいずれかを含むことができるオブジェクトです。
を見てみましょう この質問, 、そして、この場合、整合性の構成違いまたはintのいずれかを含むオブジェクトのいずれかを処理するいくつかの方法が表示されます。参照 http://scala.playframework.org/.../scala$mayerr.html, 、バリューメンバーを参照して、どちらのオブジェクトをつかむことができるようです e
. 。暗黙の変換も利用できるようですので、あなたはただ扱うことができます MayErr[IntegrityConstraintViolation,Int]
として Either[IntegrityConstraintViolation,Int]
それ以上の式典なし。