【发布时间】:2014-02-02 05:39:18
【问题描述】:
通过 json 字段查询 Postgres 9.3 真的很棒。 但是我找不到更新 json 对象的正式方法,为此我使用了基于以前的帖子 (How do I modify fields inside the new PostgreSQL JSON datatype?) 用 plpythonu 编写的内部函数:
CREATE OR REPLACE FUNCTION json_update(data json, key text, value json)
RETURNS json AS
$BODY$
from json import loads, dumps
if key is None: return data
js = loads(data)
js[key] = value
return dumps(js)
$BODY$
LANGUAGE plpythonu VOLATILE
当我的 json 更新保持扁平和简单时,它的效果非常好。假设“chat”是“GO_SESSION”表中的json类型,并且包含{"a":"1","b":"2"},下面的代码会改变 'b' 值并将 "chat" 变为 {"a":"1","b":"5"}
update "GO_SESSION" set chat=json_update(chat,'b','5') where id=3
问题是当我试图为 'b' 另一个对象而不是一个简单的值赋值时:
update "GO_SESSION" set chat=json_update(chat,'b','{"name":"steve"}') where id=3
数据库中的结果是 'b' 包含转义字符串而不是真正的 json 对象:
{"a": "1", "b": "{\"name\":\"steve\"}"}
我尝试了不同的方法来取消转义或转储我的 json 以保留 'b' 一个对象,但找不到解决方案。
谢谢
【问题讨论】:
-
很想知道......谁在编写教程来教用户创建这些疯狂的模式?
-
这个问题是基于以前的帖子:stackoverflow.com/questions/18209625/…
-
可能是这样,但以这种方式更新 json 仍然是可疑的,委婉地说。如果您需要更新存储在 json 中的个别数据,则该数据几乎肯定应该是表中的 实际 字段。
-
这种结构的效率很大程度上取决于它的使用方式。例如,如果我当前的 json 字段被指定用于处理大量的“读取”请求,而使用 postgres json 数据类型的“写入”则更少,这样可以很好地达到目的。
-
如果您的“读取”并不意味着“读取整个 json 数据,但在从数据库中取出之前根本不知道里面有什么”,我认为您会在路上大吃一惊。说到这一点,从内部角度来看,您可能会阅读应用程序中的整个字段,在其中进行编辑,然后更新整个字段……这就是 Postgres 在使用函数时所做的事情;唯一的区别是,您试图从 PG 中松散地操纵 json 相当于重新发明了性能不佳的
update语句版本。
标签: python json postgresql