存储字节数组时Scala Anorm Postgresql错误

时间:2012-08-17 06:56:13

标签: postgresql scala jdbc playframework-2.0 anorm

我在Scala Playframework中有一个数据库表定义为

CREATE TABLE account (
    id     SERIAL,
    email  TEXT  NOT NULL,
    buffer BYTEA NOT NULL,
    PRIMARY KEY (id)
);

我正在使用协议缓冲区将对象序列化为具有以下代码的字节数组

DB.withConnection{ implicit c=>
  SQL("INSERT INTO device (buffer,secret) VALUES ({secret},{buffer})").on(
    "secret"->device.getSecret(),
    "buffer"->device.toByteArray()
  ).executeInsert()
}

device.toByteArray()返回的类型为Array[Byte],其中应该匹配该列的数据库类型。但是在执行代码时我得到了

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[PSQLException: ERROR: column "buffer" is of type bytea but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.
  Position: 44]]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1.jar:2.0.3]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1.jar:2.0.3]
    at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor.jar:2.0.2]
    at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1.jar:2.0.3]
    at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor.jar:2.0.2]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor.jar:2.0.2]
Caused by: org.postgresql.util.PSQLException: ERROR: column "buffer" is of type bytea but expression is of type character varying

1 个答案:

答案 0 :(得分:4)

查看anorm sourcePostgres docs,您似乎需要使用Array[Byte]而不是{{1}添加正确存储setBytes的处理程序当前代码所要求的。

我会在框架中的anyParameter中扩展匹配以读取

setObject

并添加

    value match {
      case Some(bd: java.math.BigDecimal) => stmt.setBigDecimal(index, bd)
      case Some(b: Array[Byte]) => stmt.setBytes(index, b)
      case Some(o) => stmt.setObject(index, o)
      // ...

你应该可以在框架之外通过这里的类型类魔术来做到这一点,但我现在没有时间弄明白。