I таблица с полем id
и полем jsonb
в базе данных postgresql. jsonb имеет структуру, которая выглядит примерно так:
{
"id": "some-id",
"lastUpdated": "2018-10-24T10:36:29.174Z",
"counters": {
"counter1": 100,
"counter2": 200
}
}
Что мне нужно сделать, так это обновить lastModified
и один из счетчиков:
def update(id: String, counter: Option[String])
Так, например, если я делаю update("some-id", Some("counter2"))
, мне нужно, чтобы lastUpdated
было текущей датой и временем, а counter2
увеличивалось до 201
.
Я использую ScalikeJDBC, и вот где я до сих пор:
def update(id: String, counter: Option[String]): Option[ApiKey] = DB localTx { implicit session =>
val update =
if(counter.isDefined)
sqls"""'{"lastUpdated": ${DateTime.now()}, "counters": {'${counter.get}: COALESCE('counters'->>${counter.get},'0')::int'}'"""
else
sqls"""'{"lastUpdated": ${DateTime.now()}}'"""
sql"UPDATE apiKey SET content = content || $update WHERE id = $key".update().apply()
}
Но я получаю следующую ошибку:
org.postgresql.util.PSQLException: The column index is out of range: 4, number of columns: 3
Я пробовал другие подходы, но мне не удалось заставить его работать. Можно ли написать это как один запрос?
Вот сломанная скрипка, чтобы помочь с тестированием https://www.db-fiddle.com/f/bsteTUMXDGDSHp32fw2Zop/1
jsonb_set
: db-fiddle.com/f /mSugD6cNPc5EiujCtRjZjd/2 Проблема с||
заключается в том, что он не выполняет рекурсивное слияние. - person Ionuț G. Stan   schedule 22.11.2018