如何使用带有Scala的Anorm从数据库中提取二进制信息

时间:2012-08-24 12:18:17

标签: database scala playframework playframework-2.0 anorm

我将一个字段作为二进制文件(64)存储在数据库中,我正在尝试使用Scala使用Anorm解析器来提取它。怎么办?

我最感兴趣的是使用ParserAPI,因为此处记录了StreamAPI:http://www.playframework.org/documentation/2.0.2/ScalaAnorm

1 个答案:

答案 0 :(得分:2)

抱歉,我没有时间为您测试,但这是一个可能的解决方案。

首先定义一个隐式转换器,它能够将列内容转换为字节数组:

implicit def rowToByteArray: Column[Array[Byte]] = Column.nonNull { (value, meta) =>
  val MetaDataItem(qualified, nullable, clazz) = meta
  value match 
    case data: Array[Byte] => Right(data)
    case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass + " to Byte Array for column " + qualified))
  }

然后,您可以定义适当的行解析器工厂:

def bytes(columnName: String): RowParser[Array[Byte]] = get[Array[Byte]](columnName)(implicitly[Column[Array[Byte]]])

最后只需使用它:

val images:List[String~Array[Byte]] = {
  SQL("select * from Image").as( str("name") ~ bytes("data") * ) 
}