Comment dois-je utiliser MayErr [IntegrityConstraintViolation, Int] à Scala et Anorm?
-
27-10-2019 - |
Question
J'utiliser Anorm pour faire des requêtes de base de données. Quand je fais un executeUpdate()
, comment dois-je faire la gestion des erreurs appropriée? il a le type de retour MayErr[IntegrityConstraintViolation,Int]
, est-ce un jeu ou une carte?
Il est par exemple d'un , mais je ne le font pas comprendre comment je dois gérer la valeur de retour:
val result = SQL("delete from City where id = 99").executeUpdate().fold(
e => "Oops, there was an error" ,
c => c + " rows were updated!"
)
Comment puis-je vérifier si la requête a échoué? (En utilisant result
), et comment puis-je obtenir le numer des lignes affectées si la requête a réussi?
En ce moment j'utilise ce code:
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!"
)
Mais je ne sais pas comment devrait ressembler à mon code de gestion des erreurs. Y at-il par exemple sur la façon d'utiliser la valeur de retour de type MayErr[IntegrityConstraintViolation,Int]
?
La solution
Vous pouvez évidemment faire un
val updateResult = ....executeUpdate()
val success = updateResult.fold(e => false, c => true)
Il semble que vous pouvez également appeler
val success = updateResult.isRight
De manière plus générale, vous pouvez accéder à l'un ou l'autre enveloppé avec
updateResult.e match {
case Left(error) => ... do something with error ...
case Right(updateCount) => ...do something with updateCount...
}
Peut-être quelqu'un plus familier avec le jeu expliquerait pourquoi scala.Either est enveloppé dans MayErr?
Autres conseils
On dirait que MayErr
est Either
d'emballage. Il est donc ni Map
ni Set
, mais plutôt un objet qui peut contenir l'un des deux objets typés différemment.
Jetez un oeil à cette question , et vous verrez quelques-uns des moyens de traitement d'un objet ou l'autre, qui dans ce cas contient soit un IntegrityConstraintViolation ou un int. Se référant à http: // scala. playframework.org/.../Scala$MayErr.html , il semble que vous pouvez saisir un objet soit en se référant à l'élément de valeur e
. Il semble y avoir trop une conversion implicite disponibles, il vous suffit de traiter un MayErr[IntegrityConstraintViolation,Int]
comme Either[IntegrityConstraintViolation,Int]
sans autre cérémonie.