【问题标题】:Set 'Autocommit=false' with Airflow Snowflake Operator使用 Airflow Snowflake Operator 设置“Autocommit=false”
【发布时间】:2020-05-01 09:56:03
【问题描述】:

我有一个简单的 DAG,旨在作为一个事务提交。我在这个用例中使用 Airflow,因为 Snowflake 不允许在存储过程或任务中进行事务控制。

在查看负责开始事务的特定任务的任务日志时,我注意到每个连接上的自动提交都设置为 true:

[2020-05-01 09:19:07,460] {{logging_mixin.py:112}} INFO - [2020-05-01 09:19:07,460] {{cursor.py:525}} INFO - query: [ALTER SESSION SET autocommit=True]

我需要将此属性设置为false,可以吗?

【问题讨论】:

    标签: transactions airflow snowflake-cloud-data-platform


    【解决方案1】:

    https://github.com/apache/airflow/blob/v1-10-stable/airflow/contrib/operators/snowflake_operator.py挖包代码

    注意到在 Snowflake 运算符初始化时,您可以将那里的 auto-commit 属性设置为 false。

    我可以确认设置此属性值后,日志反映了这一点:

    [2020-05-01 11:05:24,817] {{logging_mixin.py:112}} INFO - [2020-05-01 11:05:24,817] {{cursor.py:525}} INFO - query: [ALTER SESSION SET autocommit=False]
    

    【讨论】:

    • 很高兴听到您找到了该选项。或者,我相信您也可以将 Snowflake 运算符与 SQL BEGINCOMMIT 语句一起使用,以确保在一个事务中执行所有操作。
    • 嗨西蒙,谢谢你的建议。我注意到一些例子使用了这种技术。我是否认为您可以只给 Snowflake Operator 一个 SQL 语句字典,并假设您以 BEGIN 开头并以 COMMIT 结尾,所有语句都作为一个事务执行?
    • 是的。你可以传递一个List,而不是一个字典,一个字符串或一个要运行的字符串。如果您查看 DBAPI 运算符(Snowflake 运算符继承),您会看到所有 SQL 语句都在循环中执行,然后在最后完成单个提交(如果您有 autocommit 设置到false)。如果您将autocommit 设置为true 但是(默认值),您仍然可以在执行传递BEGIN 作为第一条语句的单个事务中执行所有操作。
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2022-11-18
    • 2021-02-28
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多