gpt4 book ai didi

json - 使用 Anorm 在 PostgreSQL json 字段中插入 Json 对象

转载 作者:行者123 更新时间:2023-12-04 14:28:55 30 4
gpt4 key购买 nike

我怎样才能通过 JsObjectjson带有 Anorm 的 PostgreSQL 9.3 数据库中的数据类型字段,而不必将其转换为字符串?

给定一个 PostgreSQL 9.3 表,例如:

create table profiles
(
id serial primary key,
profile json null
);

使用 Play 2.2,此测试成功:
package helpers

import anorm._
import org.specs2.mutable._
import org.specs2.runner._
import org.junit.runner._
import play.api.db.DB
import play.api.libs.json._
import play.api.test._

@RunWith(classOf[JUnitRunner])
class AnormTest extends Specification {
"AnormTest" should {
"insert a JSON object" in new WithApplication {
val profile = Json.obj("language" -> "en")
val sql = SQL("insert into profiles (profile) values (CAST({profile} AS json))")
.on("profile" -> profile.toString)
DB.withConnection { implicit c => sql.execute() }
}
}
}

但随着这些行改变:
      val sql = SQL("insert into profiles (profile) values ({profile})")
.on("profile" -> profile)

它产生这个错误:
org.postgresql.util.PSQLException: 
Can't infer the SQL type to use for an instance of play.api.libs.json.JsObject.
Use setObject() with an explicit Types value to specify the type to use.

由于使用 Anorm 我们通常传递适当的数据类型而不是文本(例如, UUID 数据类型的列的 uuid 对象),因此必须转换 JsObject 并不是最佳选择。到一个字符串并将其转换回 json SQL 语句中的数据类型。

有关此问题的示例及其解决方法,请参阅 Using PostgreSQL's native JSON support in Play Framework 2.1-RC1 .

如何使用 Anorm 避免这种情况以通过 JsObject直接作为 json数据类型?

最佳答案

对于 Play 2.4 及更高版本,直接使用 anorm.Object(value: org.postgresql.util.PGobject) 类而不是 value:

val pgObject = new org.postgresql.util.PGobject();
pgObject.setType("json");
pgObject.setValue(profile);
val sql = SQL("insert into profiles (profile) values ({profile})")
.on("profile" -> anorm.Object(pgObject))

关于json - 使用 Anorm 在 PostgreSQL json 字段中插入 Json 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19599346/

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