So erhalten Sie „Char“-Werte von Postgres mit Anorm
-
21-12-2019 - |
Frage
Ich habe eine Postgres-Tabelle -
CREATE TABLE "Contest"
(
id serial NOT NULL,
name varchar(100) NOT NULL,
type char(1) NOT NULL,
status char(1) NOT NULL,
...
)
Ich versuche, Feldwerte abzurufen type
Und status
zurück zu meiner Play 2.x (Anorm)-Anwendung:
val parseContest = {
get[Pk[Int]]("id") ~
get[String]("name") ~
get[Char]("type") ~
get[Char]("status") map {
case id~name~c_type~status =>
Contest(id, name, c_type, status)
}
}
und erhalte die Fehlermeldung:
could not find implicit value for parameter extractor: anorm.Column[Char]
Es sieht so aus, als ob „Char“ von einer Norm nicht unterstützt wird.Was sollte ich an meinem Code ändern?Ist es eine gute Praxis, es zu verwenden? get[String]("status")
und dann status.head
als Workaround?
Lösung
Ich denke, Sie könnten einen impliziten Konverter für Sie schreiben char
Säulen.Das würde so aussehen:
implicit def columnToChar: Column[Char] = {
Column[Char](transformer = {
(value, meta) =>
val MetaDataItem(qualified, nullable, clazz) = meta
value match {
case ch: String => Right(ch.head)
case _ => Left(TypeDoesNotMatch("Cannot convert " + value + " to Char for column " + qualified))
}
})
}
Stellen Sie dann sicher, dass dieser Konverter im Lieferumfang enthalten ist.
Ich bin mir nicht sicher, ob es sich bei dem Wert um einen String handelt, aber Sie können ihn überprüfen und die entsprechenden Korrekturen vornehmen.
Andere Tipps
Zu diesem Thema gibt es kürzlich eine zusammengeführte PR auf Anorm: https://github.com/playframework/playframework/pull/2189