我在PostgreSQL数据库中有一个表,该表具有id
字段和jsonb
字段。 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: 列索引超出范围:4,列数为3
我尝试了其他方法,但无法使其工作。是否可能将此写为单个查询?
这是一个有问题的fiddle,可用于测试 https://www.db-fiddle.com/f/bsteTUMXDGDSHp32fw2Zop/1
jsonb_set
调用:https://www.db-fiddle.com/f/mSugD6cNPc5EiujCtRjZjd/2 使用||
的问题在于它不执行递归合并。 - Ionuț G. Stan