You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL如何正确导出jsonb类型列?

错误原因

你当前的写法导出的内容不符合标准JSON格式:

  • 默认COPY TO的文本格式会自动转义jsonb内的双引号、换行等特殊字符,和JSON本身的转义规则冲突
  • 导出的每一行是单独的JSON对象,但整个文件既不是合法的JSON数组,也不是标准的JSON Lines格式,所以jq和Python直接读取整个文件会解析失败

正确导出方法

场景1:导出为JSON Lines格式(每行一个独立JSON对象,适合逐行处理)

这种格式jq和Python都可以直接逐行读取解析,性能更高,适合大数据量:

COPY (SELECT data::text FROM your_table) TO '/tmp/data.jsonl' WITH (
  FORMAT text,
  ENCODING 'UTF8',
  ESCAPE 'off'
);

如果没有服务器文件写入权限,可以用psql客户端的\copy命令,结果存在本地:

\copy (SELECT data::text FROM your_table) TO '/tmp/data.jsonl' WITH (FORMAT text, ENCODING 'UTF8', ESCAPE 'off')

读取方式:

  • jq直接读:jq . /tmp/data.jsonl
  • Python逐行读:
import json
res = []
with open('/tmp/data.jsonl', 'r', encoding='utf8') as f:
    for line in f:
        res.append(json.loads(line.strip()))

场景2:导出为单文件合法JSON数组(所有结果放在一个JSON数组里,适合小数据量)

COPY (SELECT json_agg(data)::text FROM your_table) TO '/tmp/data.json' WITH (
  FORMAT csv,
  QUOTE e'\x01',
  DELIMITER e'\x02',
  HEADER off
);

这里用了不可见字符作为分隔符和Quote字符,完全避免PostgreSQL对JSON内容的转义,导出的文件就是标准的JSON数组,直接用jq和Python加载即可:

  • jq读:jq . /tmp/data.json
  • Python读:
import json
with open('/tmp/data.json', 'r', encoding='utf8') as f:
    res = json.load(f)

内容的提问来源于stack exchange,提问作者browse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:54:03