【问题标题】:Psycopg copy_expert method - How to use properlyPsycopg copy_expert 方法——如何正确使用
【发布时间】:2017-01-12 15:10:45
【问题描述】:

我正在尝试运行这样的代码:

query = "copy  (select email from my_table) TO 'STDOUT' WITH (FORMAT csv, DELIMITER '|', QUOTE '^', HEADER FALSE)"
out_file = StringIO()
cursor.copy_expert(query, out_file, size=8192)

使用copy_expert cursor method

但是我收到了这个错误:

Traceback (most recent call last):
  File "etl/scripts/scratch.py", line 32, in <module>
    cursor.copy_expert(query, out_file, size=8192)
psycopg2.ProgrammingError: must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

我无法以超级用户身份运行它,而且似乎不需要这样做,因为我没有接触任何真实文件。

【问题讨论】:

  • 如果我没记错的话,StringIO 有点像内存文件。 psycopg2 似乎不支持这一点。为什么需要这个 StringIO?
  • 我想在内存中做所有事情。所有文档都说需要“将数据写入文件的类对象。它必须有一个 write() 方法。”

标签: python postgresql psycopg2 psycopg


【解决方案1】:

two variants of COPY TO:

  • COPY TO STDOUT,将数据流式传输回客户端,并且
  • COPY TO 'filename',写入服务器端文件(需要超级用户权限)。

您的COPY 语句在STDOUT 关键字周围有引号,导致它被解释为文件名。只需删除它们。

【讨论】:

  • 是的,我确认可以删除引号。谢谢!
【解决方案2】:

您也可以使用 csv 模块代替 copy_expert

import csv

from sqlalchemy.orm import Session
from sqlalchemy import create_engine

_url = f"snowflake://user:test124/snow.com:443/DB/WAREHOUSE/ACCOUNT"
with open("sample.csv", "w") as csv_file:
    with Session(create_engine(_url).engine) as session:
        result = session.execute("select * from my_table")
        data = result.fetchall()
        csv_writer = csv.writer(csv_file)
        csv_writer.writerows(data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2021-12-22
    相关资源
    最近更新 更多