Postgresql 如何使用数组创建anorm的解析器?

Postgresql 如何使用数组创建anorm的解析器?,postgresql,scala,playframework,anorm,Postgresql,Scala,Playframework,Anorm,我正在使用支持数组列字段的postgresql。要解析一行,我使用这个解析器。它在数组对象上有错误。我想我做错了 case class ServiceRequest( id: Pk[Long], firstname: String, lastname: String, images: Array[String]) val parser: RowParser[ServiceRequest] = { get[Pk[Long]]("id") ~ get[Strin

我正在使用支持数组列字段的postgresql。要解析一行,我使用这个解析器。它在数组对象上有错误。我想我做错了

case class ServiceRequest(
  id: Pk[Long],
  firstname: String,
  lastname: String,
  images: Array[String])

val parser: RowParser[ServiceRequest] = {
    get[Pk[Long]]("id") ~
      get[String]("firstname") ~
      get[String]("lastname") ~
      Error here >>> get[Array[String]]("images") map {
        case id ~ firstname ~ lastname ~ images=>
          ServiceRequest(id, firstname, lastname, images)
      }
  }

谢谢

我通过添加此转换器解决了我的问题:

implicit def rowToStringArray: Column[Array[String]] = Column.nonNull { (value, meta) =>
    val MetaDataItem(qualified, nullable, clazz) = meta
    value match {
      case o: java.sql.Array => Right(o.getArray().asInstanceOf[Array[String]])
      case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass))
    }
  }

转换器将数据类型从postgresql的jdbc转换为SELECT函数中解析器的java数据类型。插入时,需要另一个转换器将java的数据类型转换为postgresql的jdbc。

当前有一个pullrequest,要求添加对java.sql.Array作为列映射的支持:

最好的是,现在play 2.4.x本机支持阵列[T]类型,您不必使用自己的转换器。 但是,使用insert或update语句仍然不太好,例如:

def updateTags(id: Long, values: Seq[String]):Int = {
    DB.withConnection { implicit conn =>
      SQL("UPDATE entries SET tags = {value} WHERE id = {id}")
        .on('value -> values, 'id -> id).executeUpdate
} 
会给你一个错误

播放-无法调用操作,最终出现错误: org.postgresql.util.PSQLException:错误:语法错误位于或接近$2

简单地说,您应该使用java.sql.Array类型创建PreparedStatement:

在'value->conn.createArrayOfvarchar,value.asInstanceOf[Array[AnyRef]]

从现在播放的2.4-M1开始,默认情况下java.sql.Array不会转换为ParameterValue,这意味着 SQL….on`arr->values:java.SQL.Array仍然给出编译错误,您需要另一个隐式转换才能使其编译:

  implicit object sqlArrayToStatement extends ToStatement[java.sql.Array] {
    def set(s: PreparedStatement, i: Int, n: java.sql.Array) = s.setArray(i, n)
  }

这只是一个猜测,我是scala&anorm的新手,但你试过Seq[String]吗?我试过Seq和List。两者都一样。我刚刚找到了一个为解析器创建自定义提取器的解决方案。你能发布它吗?我相信它会对其他人有帮助,包括但不限于我:当然,我会在完成代码并测试它以确保它正常工作后。Thank.PR在Master上合并,正如您在测试/规格中看到的,该功能包含在最新来源中:真棒!!!!在2.4版本发布之前,我相信它将支持阵列,这是并且将很好地工作!!!!