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

如何通过Python/psycopg2的copy_expert正确解码PostgreSQL COPY的STDOUT转义

最优方案:直接让COPY命令不做额外转义

因为你每次只输出单字段的JSON内容,完全可以通过调整COPY参数避开额外转义,不需要事后解码,性能最高也最安全:

COPY (SELECT my_jsonb FROM large_table) TO STDOUT WITH (
  FORMAT csv,
  QUOTE NONE,
  ENCODING 'UTF8'
)

这个方案的逻辑是:

  • 单字段输出时CSV格式不会生成多余的分隔符
  • QUOTE NONE参数(PostgreSQL 10及以上版本支持)会关闭字段包裹、额外转义逻辑,直接输出原始内容
  • 输出的每一行就是原生的合法JSON字符串,完全不需要做任何转义处理,你可以直接删掉自定义的unescape函数
兼容旧版本PostgreSQL的方案:正确解码FORMAT text的全部转义

如果你的PostgreSQL版本低于10不支持QUOTE NONE,可以用标准的text格式转义解码逻辑替换你现在仅替换反斜杠的实现,覆盖所有转义规则:

def unescape(line: bytes) -> bytes:
    # 先移除末尾的换行符
    line = line.rstrip(b'\r\n')
    # 空值特殊处理,如果字段不允许为空可以去掉这段判断
    if line == b'\\N':
        return b'null'
    # 按照PostgreSQL TEXT格式的转义规则解码所有转义序列
    return line.decode('unicode_escape').encode('utf-8')

你原来的实现只处理了反斜杠转义,会遗漏以下FORMAT text的转义场景:

  • 换行符会被转义为\n字符串
  • 回车符会被转义为\r字符串
  • 制表符会被转义为\t字符串
    上述解码逻辑可以覆盖所有官方定义的text格式转义规则。

内容的提问来源于stack exchange,提问作者André C. Andersen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:45:00