postgresql - 是否可以控制 JSONB 序列化?

标签 postgresql postgresql-9.6

我想导出 jsonb Postgres (v9.6) 表中的列。

我尝试了 COPY命令:

\COPY (SELECT my_json_column FROM my_table) to 'data.json';

我确实得到了一个 JSON 文件,但我想要两个修改:

  1. 我想节省空间:分隔符 :, 后没有空格。
  2. 我想要统一且可预测的键排序。

换句话说,我想要 Python json.dump 的行为有参数

  1. 分隔符=(',',':')
  2. sort_keys=True

(这是摄取文件的格式,我想以相同的格式导出它以检查往返是否相同。)

最佳答案

没有用于格式化 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';

关于postgresql - 是否可以控制 JSONB 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747464/

相关文章:

ruby-on-rails - PGError : ERROR: relation "schema_migrations" does not exist when I heroku db:push

postgresql - 使用 AWS 数据迁移服务 (DMS) 从 Heroku PostgreSQL 迁移到 AWS RDS 不工作

json - 在 PostgreSQL 中,如何生成没有反斜杠和外部双引号的干净 JSON?

postgresql - 如何启用 pg_xlog 的自动清理

postgresql - 在 Erlang 中为 PostgreSQL 编写网关是个好主意吗?

sql - 递归 CTE 如何使用它

sql - 如何在 SQL 中应用带有问号符号的 liquibase 变更集

postgresql - 如何将复杂类型数组的成员与 SELECT 进行比较?

Postgresql INSERT ... ON CONFLICT ... WHERE 不触发

postgresql - 如何为 psql 脚本的一部分暂停 PostgreSQL 的 ON_ERROR_STOP?