簡體   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