Airflow 如何将sql执行结果记录到数据库中?

Airflow 如何将sql执行结果记录到数据库中?,airflow,psycopg2,Airflow,Psycopg2,我使用python操作符对redshift/postgres数据库执行sql查询。为了进行调试,我希望DAG返回sql执行的结果,与在控制台中本地执行类似: 我正在使用psycop2创建连接/游标并执行sql。记录此日志将非常有助于确认已解析的参数化sql,并确认数据已实际插入。我曾痛苦地经历过环境差异导致意外行为的问题 我对气流或python DBAPI的低级工作没有深入的了解,但pscyopg2文档似乎确实提到了一些方法和连接配置,这些方法和配置可能允许这样做 我发现很难做到这一点非常令人困

我使用python操作符对redshift/postgres数据库执行sql查询。为了进行调试,我希望DAG返回sql执行的结果,与在控制台中本地执行类似:

我正在使用psycop2创建连接/游标并执行sql。记录此日志将非常有助于确认已解析的参数化sql,并确认数据已实际插入。我曾痛苦地经历过环境差异导致意外行为的问题

我对气流或python DBAPI的低级工作没有深入的了解,但pscyopg2文档似乎确实提到了一些方法和连接配置,这些方法和配置可能允许这样做

我发现很难做到这一点非常令人困惑,因为我认为这将是在这个平台上运行ETL的主要用例。我听过一些建议,建议只创建额外的任务,在前后查询表,但这似乎很笨拙且无效

请任何人解释这是如何可能的,如果不可能,请解释为什么?欢迎采用其他方法取得类似结果。谢谢

到目前为止,我已经尝试了connection.status_message方法,但它似乎只返回sql的第一行,而不返回结果。我还尝试创建一个日志游标,它生成sql,但不生成控制台结果

导入日志记录 将psycopg2导入为pg 从psycopg2.extras导入日志连接 连接=pg.connect 连接工厂=记录连接, ... conn.autocommit=True logging.basicConfiglevel=logging.DEBUG logger=logging.getLogger\uuu名称__ logger.addHandlerlogging.StreamHandlersys.stdout 康涅狄格 cur=conn.cursor sql= 插入到mytable中 挑选* 从另一张桌子 ; cur.executesql 我希望记录器返回如下内容:

sql> INSERT INTO mytable (
     SELECT ...
[2019-07-25 23:00:54] 912 rows affected in 4 s 442 ms

假设您正在编写一个使用postgres钩子在sql中执行某些操作的操作符

操作员内部打印的任何内容都会被记录

因此,如果要记录该语句,只需在运算符中打印该语句

printsql 如果要记录结果,请获取结果并打印结果。 例如

结果=cur.fetchall 对于结果中的行: 打印行
或者,您可以使用self.log.info代替打印,其中self指的是操作员实例。

好的,因此经过一些尝试和错误,我找到了一种适合我的设置和目标的方法。总而言之,我的目标是通过python脚本运行ETL,并在Airflow中进行编排。参考以下文件:

包含上一个命令返回的消息的只读属性:

关键是在服务器上执行事务的上下文中管理日志记录。为了做到这一点,我必须专门设置con.autocommit=False,并用begintransaction包装SQL块;和结束事务;。如果在删除或插入语句后直接插入cur.statusmessage,则会得到诸如“insert 0 92380”之类的响应

这仍然不像我希望的那样详细,但它比没有好得多,对于解决气流日志中的ETL问题非常有用

旁注: -当autocommit设置为False时,必须显式提交事务。 -可能不需要在SQL中声明事务开始/结束。这可能取决于您的DB版本

con=psy。连接。。。 con.autocommit=False cur=con.cursor 尝试: 当前执行[某些sql] logging.infofCursor statusmessage:{cur.statusmessage} 除: 反卷 最后: 结束
我确信psycopg2中有一些隐藏的功能可以利用,但文档非常薄,没有明确的示例。如果有人对如何利用logobjects或返回join-PID以某种方式检索其他信息提出建议。

hi,您使用的是什么版本的psycopg?对我来说,没有cur.messages方法,只有cur。statusmessage@Jonathan好的,我已经去掉了那个部分。要点仍然是:如果您想让信息进入日志,请打印它或使用self.log.info