¿Cómo debo usar Mayerr [IntegrityConstraintViolation, int] en Scala y Anorma?
-
27-10-2019 - |
Pregunta
yo suelo Anorma hacer consultas de base de datos. Cuando hago un executeUpdate()
, ¿Cómo debo hacer el manejo de errores adecuado? Tiene tipo de retorno MayErr[IntegrityConstraintViolation,Int]
, ¿es este un conjunto o un mapa?
Hay un ejemplo, pero no entiendo cómo debería manejar el valor de retorno:
val result = SQL("delete from City where id = 99").executeUpdate().fold(
e => "Oops, there was an error" ,
c => c + " rows were updated!"
)
¿Cómo verifico si la consulta falló? (usando result
), y ¿cómo obtengo el número de filas afectadas si la consulta fue exitosa?
Por el momento uso este código:
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!"
)
Pero no sé cómo debería ser mi código de manejo de errores. ¿Hay algún ejemplo sobre cómo usar el valor de retorno del tipo? MayErr[IntegrityConstraintViolation,Int]
?
Solución
Obviamente podrías hacer un
val updateResult = ....executeUpdate()
val success = updateResult.fold(e => false, c => true)
Parece que también puedes llamar
val success = updateResult.isRight
En general, puede acceder al envuelto con
updateResult.e match {
case Left(error) => ... do something with error ...
case Right(updateCount) => ...do something with updateCount...
}
Tal vez alguien más familiarizado con el juego explicaría por qué Scala. ¿Está envuelto en Mayerr?
Otros consejos
Parece que MayErr
es envoltura Either
. Entonces no es ni un Map
ni Set
, sino más bien un objeto que puede contener uno de los dos objetos tipados de manera diferente.
Echa un vistazo a esta pregunta, y verá algunas formas de procesar un objeto, que en este caso contiene una IntegrityConstraintViolation o un int. Refiriéndose a http://scala.playframework.org/.../scala$mayerr.html, parece que puede tomar un objeto refiriéndose al miembro del valor e
. Parece haber una conversión implícita disponible también, por lo que puede tratar un MayErr[IntegrityConstraintViolation,Int]
como Either[IntegrityConstraintViolation,Int]
sin más ceremonia.