3

Anormを使用してデータベース クエリを実行します。を実行する場合executeUpdate()、適切なエラー処理を行うにはどうすればよいですか? 戻り値の型MayErr[IntegrityConstraintViolation,Int]があります。これは Set ですか、それとも Map ですか?

がありますが、戻り値をどのように処理すればよいかわかりません:

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!"
)

しかし、エラー処理コードがどのように見えるべきかわかりません。type の戻り値を使用する方法の例はありますMayErr[IntegrityConstraintViolation,Int]か?

4

2 に答える 2

3

MayErrラッピングしているようですEither。したがって、これは や ではなく、型の異なる 2 つのオブジェクトのいずれMapSetを含むことができるオブジェクトです。

この質問を見ると、この場合は IntegrityConstraintViolation または Int のいずれかを含む、Either オブジェクトを処理するいくつかの方法がわかります。http://scala.playframework.org/.../Scala$MayErr.htmlを参照すると、値 member を参照することで、Either オブジェクトを取得できるようですe。暗黙的な変換も利用できるようですので、それ以上の式なしで aMayErr[IntegrityConstraintViolation,Int]を an として扱うことができます。Either[IntegrityConstraintViolation,Int]

于 2011-06-12T19:32:13.700 に答える
2

あなたは明らかにすることができます

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...
}

Play に詳しい人なら、scala.Either が MayErr でラップされている理由を説明してくれるでしょうか?

于 2011-06-12T19:32:00.057 に答える