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]?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top