2015-01-21 4 views
3

Столбец data таблицы PostgreSQL my_table имеет формат jsonb. Я хотел бы вставить Scala JsObject (или JsValue), но не знаю, как это сделать!Вставка данных в столбец jsonb PostgreSQL через Scala Anorm (в Play Framework)

Следующий код не компилируется, так как функция 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() 
    } 
    } 

Что такое решение?

+0

возможно дубликат (http://stackoverflow.com/questions/27573778/postgresql-jsonb-and -jdbc) – cchantep

+0

Конкретное преобразование параметров можно подключить, чтобы подготовить часть инструкции SQL и передать значения JSON. – cchantep

+0

@applicius Это не дубликат [PostgreSQL jsonb, '?' и JDBC] (http://stackoverflow.com/questions/27573778/postgresql-jsonb-and-jdbc). Мой вопрос касается инструкции 'insert'. – Blackbird

ответ

2

:: jsonb tag в конце значения. например.

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

Это будет работать. Это сработало для меня. То, как я вставил в столбец postgres db типа jsonb.

+1

Спасибо за ваш ответ! Это, вероятно, работает, но не использует Anorm. – Blackbird

0

Вы можете использовать ToStatement конвертер объект: [? PostgreSQL jsonb, \ `\` и JDBC]

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

 Смежные вопросы

  • Нет связанных вопросов^_^