Как мне использовать MayErr [IntegrityConstraintViolation, Int] в Scala и Anorm? - PullRequest
3 голосов
/ 12 июня 2011

Я использую Anorm для выполнения запросов к базе данных.Когда я делаю 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]?

Ответы [ 2 ]

3 голосов
/ 12 июня 2011

Похоже, MayErr упаковывает Either. Так что это не Map и не Set, а скорее объект, который может содержать один из двух объектов различного типа.

Посмотрите на этот вопрос , и вы увидите несколько способов обработки объекта Either, который в этом случае содержит либо IntegrityConstraintViolation, либо Int. Ссылаясь на http://scala.playframework.org/.../Scala$MayErr.html,, похоже, что вы можете получить объект Either, ссылаясь на значение элемента e. Похоже, что существует неявное преобразование, так что вы можете просто обработать MayErr[IntegrityConstraintViolation,Int] как Either[IntegrityConstraintViolation,Int] без дальнейших церемоний.

2 голосов
/ 12 июня 2011

Вы, очевидно, могли бы сделать

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?

...