gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:38:06 25 4
gpt4 key购买 nike

我管理一个有 MySQL 数据库的 Play 服务器。其中一张 table 有一个BLOB 列。在 play 2.2 中,在任何显式 ParameterValue 之前2.3 引入的业务,我可以通过注入(inject)一个来读/写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

谢谢。

最佳答案

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

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

import java.sql.PreparedStatement

// Can't have top-level implicit objects, so we need a wrapper.
object foo {
implicit object byteArrayToStatement extends ToStatement[Array[Byte]] {
def set(s: PreparedStatement, i: Int, array: Array[Byte]): Unit = {
s.setBlob(i, new javax.sql.rowset.serial.SerialBlob(array))
}
}
}

关于scala - 使用 Play 2.3 插入/更新 BLOB 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com