如何通过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
相关产品推荐
相关产品推荐

