繁体   English   中英

通过 Scala Anorm(在 Play Framework 中)将数据插入 PostgreSQL jsonb 列

[英]Inserting data to a PostgreSQL jsonb column via Scala Anorm (in Play Framework)

PostgreSQL 表my_tabledata列格式为jsonb 我想插入一个 Scala JsObject (或JsValue ),但不知道该怎么做!

以下代码无法编译,因为on期望jsonString

  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM