Wie soll ich Mayerr [IntegrityConstraintviolation, int] in Scala und AnorM verwenden?
-
27-10-2019 - |
Frage
ich benutze Anorm Datenbankabfragen durchführen. Wenn ich eine mache executeUpdate()
, wie soll ich die richtige Fehlerbehandlung durchführen? Es hat einen Rückgabetyp MayErr[IntegrityConstraintViolation,Int]
, Ist das ein Satz oder eine Karte?
Da ist ein Beispiel, aber ich verstehe nicht, wie ich mit dem Rückgabewert umgehen sollte:
val result = SQL("delete from City where id = 99").executeUpdate().fold(
e => "Oops, there was an error" ,
c => c + " rows were updated!"
)
Wie überprüfe ich, ob die Abfrage fehlgeschlagen ist? (Verwendung result
), und wie bekomme ich die Anzahl der betroffenen Reihen, wenn die Abfrage erfolgreich war?
Im Moment verwende ich diesen 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!"
)
Aber ich weiß nicht, wie mein Fehlerhandling-Code aussehen sollte. Gibt es ein Beispiel dafür, wie der Rückgabewert des Typs verwendet wird MayErr[IntegrityConstraintViolation,Int]
?
Lösung
Sie könnten offensichtlich a machen
val updateResult = ....executeUpdate()
val success = updateResult.fold(e => false, c => true)
Es sieht so aus, als ob Sie auch anrufen können
val success = updateResult.isRight
Allgemeiner können Sie auf die Wickel zugreifen
updateResult.e match {
case Left(error) => ... do something with error ...
case Right(updateCount) => ...do something with updateCount...
}
Vielleicht würde jemand, der mit dem Spiel vertraut ist, erklären, warum Scala.
Andere Tipps
Es sieht aus wie MayErr
Wickelt Either
. Also ist es weder ein Map
Noch a Set
, sondern ein Objekt, das eines von zwei unterschiedlich typisierten Objekten enthalten kann.
Sich ansehen diese Frage, und Sie werden einige Möglichkeiten sehen, ein Objekt zu verarbeiten, was in diesem Fall entweder eine IntegrityConstraintviolation oder eine int enthält. In Bezug auf http://scala.playframework.org/.../scala$mayerr.html, Es sieht so aus, als ob Sie ein Objekt holen können, indem Sie sich auf das Wertmitglied beziehen e
. Es scheint auch eine implizite Konvertierung zur Verfügung zu geben, sodass Sie einfach a behandeln können MayErr[IntegrityConstraintViolation,Int]
als an Either[IntegrityConstraintViolation,Int]
ohne weitere Zeremonie.