在 Python 中如何捕获 Redshift 对 COPY 命令的响应?
Posted
技术标签:
【中文标题】在 Python 中如何捕获 Redshift 对 COPY 命令的响应?【英文标题】:In Python how to capture Redshift's response on COPY command? 【发布时间】:2017-05-03 05:57:25 【问题描述】:我使用 SQLAlchemy + PyGreSQL 将 COPY 命令发送到 Redshift 以将 CSV/JSON 文件导入数据库表。执行 COPY 命令后,屏幕上会返回一条消息行:
INFO: Load into table 'o_item_details' completed, 20443 record(s) loaded successfully.
如何捕获此消息,以便将其推送到将日志写入文件的日志记录功能中?这是我的代码:
engine = create_engine("postgresql+pygresql://0:1@2:3/4".format(rs_user, rs_pwd, rs_host, rs_port, rs_dbname))
conn = engine.connect()
re = conn.execute(sql_cmd)
sql_cmd
是 COPY 语句 (copy rs_tbl_name from s3://s3_bucket/s3_file ...
)
我尝试了执行函数返回的 ResultProxy 对象,但没有找到检索消息的方法。
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:由于***不允许简短的回答,我不得不添加你正在阅读的这句话:)
print(conn.notices)
【讨论】:
我试过但得到以下错误消息:'Connection' object has no attribute 'notices'
我做了一些研究,也许这个属性只在psycopg2
创建的连接对象中可用,而不是由SQLAlchemy的create_engine
创建的?
绝对!抱歉,我没有注意您使用的连接提供商。马上更正我的帖子。
好的,经过一番挖掘:我不知道如何在 sqlalchemy 中使用 pygresql 来完成它,它可能比它应该的要复杂得多。您的选择: 1. 获取所需信息的最简单方法是在您的 COPY 命令之后运行select pg_last_copy_count()
。 2. 第二简单:迁移到普通的 pygresql 而不是 sqlalchemy。然后您可以使用 conn.getnotices()。 3.第三种方式:安装psycopg2,在sqlalchemy中使用psycopg2方言。使用原始答案中的 conn.notices 。不知道它是否比 2 更容易。
抱歉花了这么长时间顺便说一句,但结果比它应该的要复杂,而且生活发生在堆栈之外;)
非常感谢您帮助我。我将首先尝试您的选项(2),但需要一些工作。我从旧项目中继承了大量代码,并且 sqlalchemy 已经嵌入到任何地方。选项 (1) 绝对是一个通用的解决方案,但有时我们的 Redshift 集群的响应速度相当慢。 :(以上是关于在 Python 中如何捕获 Redshift 对 COPY 命令的响应?的主要内容,如果未能解决你的问题,请参考以下文章