是否可以控制 JSONB 序列化?
Is it possible to control the JSONB serialization?
我想导出 Postgres (v9.6) 中的 jsonb
列 table。
我尝试了 COPY
命令:
\COPY (SELECT my_json_column FROM my_table) to 'data.json';
我确实得到了一个 JSON 文件,但我想要两个修改:
- 我想保存 space:分隔符
:
和 ,
. 后没有 spaces
- 我想要统一和谓词table键排序。
换句话说,我想要 Python json.dump
带有参数
的行为
separators=(',',':')
sort_keys=True
(这是摄取文件的格式,我想以相同的格式导出它以检查往返是否相同。)
如果您想保留原始格式,请不要使用 jsonb
。使用 json
存储您输入的值。即使使用您设想的输出消息,重复的键也会丢失。
如果您需要 jsonb
设施,请即时将列转换为 jsonb
。你仍然可以提高效率,因为你可以添加一个像
这样的索引
CREATE INDEX ON mytab USING gin ((jsoncol::jsonb));
没有用于格式化 jsonb 输出的内置选项。您可以使用 PL/Python.
create extension if not exists plpython3u;
至于现在 (Postgres 10),您必须使用 Abstract Syntax Trees 将 Postgres jsonb 转换为 Python 对象(在未来的版本中可能会自动转换)。
create or replace function format_jsonb(obj jsonb)
returns text language plpython3u as $$
import json
import ast
js = ast.literal_eval(obj);
return json.dumps(js, separators=(',', ':'), sort_keys=True)
$$;
使用:
select format_jsonb('{"abcd": 1, "jklm": 2, "jkl": 3, "abc": 4}');
format_jsonb
-------------------------------------
{"abc":4,"abcd":1,"jkl":3,"jklm":2}
(1 row)
因此您的命令可能如下所示:
\COPY (SELECT format_jsonb(my_json_column) FROM my_table) to 'data.json';
我想导出 Postgres (v9.6) 中的 jsonb
列 table。
我尝试了 COPY
命令:
\COPY (SELECT my_json_column FROM my_table) to 'data.json';
我确实得到了一个 JSON 文件,但我想要两个修改:
- 我想保存 space:分隔符
:
和,
. 后没有 spaces
- 我想要统一和谓词table键排序。
换句话说,我想要 Python json.dump
带有参数
separators=(',',':')
sort_keys=True
(这是摄取文件的格式,我想以相同的格式导出它以检查往返是否相同。)
如果您想保留原始格式,请不要使用 jsonb
。使用 json
存储您输入的值。即使使用您设想的输出消息,重复的键也会丢失。
如果您需要 jsonb
设施,请即时将列转换为 jsonb
。你仍然可以提高效率,因为你可以添加一个像
CREATE INDEX ON mytab USING gin ((jsoncol::jsonb));
没有用于格式化 jsonb 输出的内置选项。您可以使用 PL/Python.
create extension if not exists plpython3u;
至于现在 (Postgres 10),您必须使用 Abstract Syntax Trees 将 Postgres jsonb 转换为 Python 对象(在未来的版本中可能会自动转换)。
create or replace function format_jsonb(obj jsonb)
returns text language plpython3u as $$
import json
import ast
js = ast.literal_eval(obj);
return json.dumps(js, separators=(',', ':'), sort_keys=True)
$$;
使用:
select format_jsonb('{"abcd": 1, "jklm": 2, "jkl": 3, "abc": 4}');
format_jsonb
-------------------------------------
{"abc":4,"abcd":1,"jkl":3,"jklm":2}
(1 row)
因此您的命令可能如下所示:
\COPY (SELECT format_jsonb(my_json_column) FROM my_table) to 'data.json';