【问题标题】:Inserting data to a PostgreSQL jsonb column via Scala Anorm (in Play Framework)通过 Scala Anorm 将数据插入 PostgreSQL jsonb 列(在 Play 框架中)
【发布时间】:2015-01-21 08:20:30
【问题描述】:

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()
    }
  }

解决办法是什么?

【问题讨论】:

  • PostgreSQL jsonb, `?` and JDBC 的可能重复项
  • 可以插入特定的参数转换来准备部分SQL语句并传递JSON值。
  • @applicius 这不是PostgreSQL jsonb, '?' and JDBC 的副本。我的问题是关于insert 声明。
  • @Blackbird 你解决这个问题了吗?
  • @mgosk 不,我没有解决它。

标签: postgresql scala playframework anorm


【解决方案1】:

在值的末尾使用 ::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 列的方式。

【讨论】:

  • 感谢您的回答!它可能有效,但没有使用 Anorm。
【解决方案2】:

您可以使用 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)
    }
  }

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2013-03-13
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2018-12-10
    • 2020-06-28
    相关资源
    最近更新 更多