使用Play 2.3插入/更新BLOB的正确方法是什么?

时间:2015-04-26 23:17:02

标签: scala playframework-2.3 anorm

我管理一台拥有MySQL数据库的Play服务器。其中一张表有一个 BLOB列。在游戏2.2中,在任何明确的ParameterValue之前 由2.3引入的业务,我只能通过注入来读/写 Array[Byte]我的查询就像这样:

val foo: Array[Byte] = ???  // Doesn't matter.
SQL("update my_table set the_blob = {foo} where id = {id}").on('foo -> foo, 'id -> id).executeUpdate()

这不再适用。它会在编译时抱怨:

type mismatch;                                                                  
  found   : (Symbol, Array[Byte])
  required: anorm.NamedParameter

似乎Anorm不知道如何转换Array[Byte],所以我的愚蠢 我写道:

// Now everything will work perfectly and I can get back to my day.
implicit def byteArrayToParameter(ba: Array[Byte]): ParameterValue = {
  ba
}

起初我没有发现任何问题,但最终我注意到了任何尝试 使用BLOB写入表格

  • 挂起浏览器。
  • 导致Play的java线程占用他们可以找到的任何CPU核心。
  • 永远不要完成写作。

许多调试让我回到上面的implicit函数。记录消息 向我展示了这种转换是在无限循环中反复调用的。

问题:如何正确处理使用Anorm编写BLOB的问题?

(或更一般地说)

问题:如何为类型提供正确的转化实例 无法自动转换为ParameterValue

谢谢。

1 个答案:

答案 0 :(得分:2)

似乎其他人也有类似的麻烦,特别是在找到如何编写这些类型映射的任何文档方面。在文档发现方面,我对Play的体验通常是消极的。

解决方案如下,借用Grokbase线程并为清晰起见进行了修改:

.attr()