Py学习  »  Python

如何通过python/psycopg2的COPY_expert从PostgreSQL复制语法中正确地取消STDOUT

André C. Andersen • 3 年前 • 1610 次点击  

我将postgres表中的jsonb对象作为一个大的 application/jsonl http响应。这非常有效:

def stream_json_from_copy_syntax():
    conn = psycopg2.connect(...)
    cur = conn.cursor()
    file = BytesIO()
    cur.copy_expert(
        sql="COPY (select my_jsonb from large_table) TO STDOUT WITH (FORMAT text)",
        file=file
    )
    file.seek(0)
    for line in file.readlines():
        line = unescape(line)
        yield line

将上述物质推入烧瓶中。这很快,而且内存占用非常小。

jsonb字段最初是正确转义的,但看起来 (FORMAT text) 正在添加一些额外的逃逸。

这就变成了 My \ string 进入propper json "My \\ string" 然后进入 "My \\\\ string" .所以有额外的逃跑。我已经用以下方法处理了这个问题:

def unescape(line):
    return line.replace(b'\\\\', b'\\')

我认为这解决了大多数问题,如果不是全部的话,但我有点不确定是否还有其他问题 (文本格式) 我还没处理好逃跑的事。

我该如何恰当地消除什么 (文本格式) 做或者有没有办法不让它逃逸任何东西,因为最初的json逃逸工作正常。

注意,使用 (ESCAPE 'escape_character') 仅适用于 (FORMAT csv) : https://www.postgresql.org/docs/current/sql-copy.html

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132940
 
1610 次点击  
文章 [ 1 ]  |  最新文章 3 年前
piro
Reply   •   1 楼
piro    3 年前

您正在以Postgres复制的格式导出数据。。。我会理解的。也许你需要一种不同的格式,比如CSV。