The data
column of PostgreSQL table my_table
is of format jsonb
. I would like to insert a Scala JsObject
(or JsValue
), but don't know how to do it!
The following code does not compile, because the on
function expects json
to be a 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()
}
}
What is the solution?
Use ::jsonb tag at the end of a value. eg.
//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()
This will work. It worked for me. Thats how I inserted into a postgres db
column of type jsonb
.
You can use ToStatement converter object:
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)
}
}
Borrowing from @KJay_wer, we can use ::jsonb
tag with Scala Anorm (Play Framework) too, and convert your JsObject
(or other JsValue
) into 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()
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.