[英]Inserting data to a PostgreSQL jsonb column via Scala Anorm (in Play Framework)
PostgreSQL 表my_table
的data
列格式為jsonb
。 我想插入一個 Scala JsObject
(或JsValue
),但不知道該怎么做!
以下代碼無法編譯,因為on
期望json
為String
:
def add(json: JsObject): Option[Long] = {
DB.withConnection {
implicit c =>
val query = """
insert into my_table(data)
values({data});"""
SQL(query).on(
"data" -> json
).executeInsert()
}
}
解決辦法是什么?
在值的末尾使用:: jsonb標記。 例如。
//my scala variables
val jsonDescription: String = "{\"name\":\"ksulr\"}"
val age = 15
//my insert statement
val sql = "INSERT into person(json_description,age) VALUES(?::jsonb,?)"
//prepared statement
val statement = conn.prepareStatement(sql)
//insert values into the sql statement
statement.setString(1,jsonDescription)
statement.setInt(2,age)
statement.executeUpdate()
這會奏效。 它對我有用。 這就是我如何插入jsonb
類型的postgres db
列。
您可以使用ToStatement轉換器對象:
def add(json: JsObject): Option[Long] = {
DB.withConnection { implicit c =>
val query = """insert into my_table(data) values(${data});"""
SQL(query).executeInsert()
}
}
implicit object jsObjectStatement extends ToStatement[JsObject] {
override def set(s: PreparedStatement, index: Int, v: JsObject): Unit = {
val jsonObject = new PGobject()
jsonObject.setType("json")
jsonObject.setValue(Json.stringify(v))
s.setObject(index, jsonObject)
}
}
借用@KJay_wer,我們也可以將::jsonb
標簽與 Scala Anorm(Play Framework)一起使用,並將您的JsObject
(或其他JsValue
)轉換為String
:
def add(json: JsObject): Option[Long] = {
DB.withConnection {
implicit c =>
val query = """
insert into my_table (data)
values ({data}::jsonb);
""".stripMargin
SQL(query).on(
"data" -> json.toString
).executeInsert()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.