如何使用Anorm将JsObject
传递到PostgreSQL 9.3数据库中的json
数据类型字段而不必将其转换为字符串?
给出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
对象),因此转换{{1转换为字符串并将其强制转换回SQL语句中的JsObject
数据类型。
有关此问题及其解决方法的示例,请参阅Using PostgreSQL's native JSON support in Play Framework 2.1-RC1。
如何使用Anorm避免将json
直接作为JsObject
数据类型传递?
答案 0 :(得分:8)
对于Play 2.4及以上版本,使用anorm.Object(value:org.postgresql.util.PGobject)类而不是直接使用值:
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))