在 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 命令的响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获插入到包含标识列的 Redshift 表中的行数?

如何在 python 中从 redshift 更快地处理数据?

如何从查询中捕获值并将其用作另一个查询中的值

如何在python中捕获对对象调用的任何方法?

是否有任何捕获 Redshift 查询控制台输出的系统表?

如何在 python udf 中使用 select 查询进行 redshift?