在 Postgres JSONB 列中意外存储字符串而不是对象
Accidentally stored string instead of object in Postgres JSONB column
我刚刚意识到插入到 JSONB 列的数据是像 "{\"foo\": 3}"
这样的字符串,而不是像 {"foo": 3}
这样的对象。我很确定原因是由于将 SQLAlchemy 模型的字段设置为
reading.blob = blob_json
而不是
reading.blob = json.loads(blob_json)
不过,我还没有找到更正现有数据的方法。 Postgres 文档给出了将文本转换为 JSON、从 JSON 中提取数组和对象元素等示例,但我找不到任何说明如何 select 的文本的内容JSONB 列只有一个字符串值。
尤里卡! #postgres 上的 DeciBull 提出了
SELECT (json_build_array('"{\"Stuff.Hello\": 0, \"Stuff.Hello2\": 1000}"'::jsonb)->>0)::jsonb
{"Stuff.Hello": 0, "Stuff.Hello2": 1000}
是的,就在我得到这个的时候:
SELECT (('"{\"foo\":42}"'::JSONB)->>0)::JSONB;
我刚刚意识到插入到 JSONB 列的数据是像 "{\"foo\": 3}"
这样的字符串,而不是像 {"foo": 3}
这样的对象。我很确定原因是由于将 SQLAlchemy 模型的字段设置为
reading.blob = blob_json
而不是
reading.blob = json.loads(blob_json)
不过,我还没有找到更正现有数据的方法。 Postgres 文档给出了将文本转换为 JSON、从 JSON 中提取数组和对象元素等示例,但我找不到任何说明如何 select 的文本的内容JSONB 列只有一个字符串值。
尤里卡! #postgres 上的 DeciBull 提出了
SELECT (json_build_array('"{\"Stuff.Hello\": 0, \"Stuff.Hello2\": 1000}"'::jsonb)->>0)::jsonb
{"Stuff.Hello": 0, "Stuff.Hello2": 1000}
是的,就在我得到这个的时候:
SELECT (('"{\"foo\":42}"'::JSONB)->>0)::JSONB;