Comment obtenir les valeurs « Char » de Postgres avec Anorm
-
21-12-2019 - |
Question
J'ai une table postgres -
CREATE TABLE "Contest"
(
id serial NOT NULL,
name varchar(100) NOT NULL,
type char(1) NOT NULL,
status char(1) NOT NULL,
...
)
J'essaie d'obtenir les valeurs des champs type
et status
retour à mon application Play 2.x (Anorm) :
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)
}
}
et j'obtiens l'erreur :
could not find implicit value for parameter extractor: anorm.Column[Char]
On dirait que 'Char' n'est pas pris en charge par anorm.Que dois-je changer dans mon code ?Est-ce une bonne pratique d'utiliser get[String]("status")
et puis status.head
comme solution de contournement ?
La solution
Je pense que vous pourriez écrire un convertisseur implicite pour votre char
Colonnes.Cela ressemblerait à ceci :
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))
}
})
}
Assurez-vous ensuite que ce convertisseur est dans le champ d'application.
Je ne suis pas sûr que la valeur soit une chaîne mais vous pouvez la vérifier et apporter les corrections correspondantes.
Autres conseils
Il y a récemment eu une fusion de relations publiques sur Anorm à ce sujet : https://github.com/playframework/playframework/pull/2189