sql - JDBC Insert with Postgres Enum -
given following person
sql , model code:
sql
create type sex enum ('male', 'female'); create table person ( id bigserial primary key, name varchar(100) not null, age integer not null, gender sex not null );
code
object person { sealed trait gender case object male extends gender case object female extends gender // credit travis brown: http://stackoverflow.com/a/30946172/409976 implicit val gendershows: show[gender] = show.shows { case male => "male" case female => "female" } } case class person private(id: option[long], name: string, age: int, gender: person.gender)
i wrote following object creating person
:
object postgresrepository { val xa = drivermanagertransactor[io]( "org.postgresql.driver", "jdbc:postgresql:person", "postgres", "postgres" ) def insert1(name: string, age: int, gender: gender) = sql"insert person (name, age, gender) values ($name, $age, ${implicitly[show[gender]].shows(gender)})".update.run.transact(xa) }
then, ran sbt console
, , tried insert:
scala> postgresrepository.insert1("foo", 3, net.phone.model.person.male) res0: scalaz.effect.io[int] = scalaz.effect.iofunctions$$anon$6@2697b43b scala> res0.unsafeperformio org.postgresql.util.psqlexception: error: column "gender" of type sex expression of type character varying hint: need rewrite or cast expression. position: 56
as exception suggested, need cast enum value expression.
def insert1(name: string, age: int, gender: gender) = { val sgender = implicitly[show[gender]].shows(gender) sql"insert person (name, age, gender) values ($name, $age, cast($sgender sex)) ".update.run.transact(xa) }
Comments
Post a Comment