Airflow 使用ds_添加和带有气流的宏

Airflow 使用ds_添加和带有气流的宏,airflow,Airflow,我想以YYYY-MM-DD HH:MM 这是我写的: EXEC_TIMESTAMP_2_MONTHS_AGO = "{{ macros.ds_add(execution_date.strftime('%Y-%m-%d/%H:%M'), -60) }}" 然而,这不起作用。它无法渲染 有什么问题 编辑: 这是接线员: import_orders_op = MySqlToGoogleCloudStorageOperator( task_id='import_orders_and_uploa

我想以
YYYY-MM-DD HH:MM

这是我写的:

EXEC_TIMESTAMP_2_MONTHS_AGO = "{{ macros.ds_add(execution_date.strftime('%Y-%m-%d/%H:%M'), -60) }}"
然而,这不起作用。它无法渲染

有什么问题

编辑: 这是接线员:

import_orders_op = MySqlToGoogleCloudStorageOperator(
    task_id='import_orders_and_upload_to_storage',
    mysql_conn_id='mysqlcon',
    google_cloud_storage_conn_id='gcpcon',
    provide_context=True,
    sql = 'import_orders.sql',
    params={'max_Orders_ID_2_months_ago': EXEC_TIMESTAMP_2_MONTHS_AGO, 'table_name' :  TABLE_NAME},
    bucket=GCS_BUCKET_ID,
    filename=file_name,
    dag=dag) 
错误是:

mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d %H:%M') }}\n   ' at line 51")

理想情况下,你应该在你的帖子中包含来自日志的任何错误消息,这将有助于未来的搜索者,也有助于缩小问题的范围

我认为现在的情况是,您使用的是
ds\u add
,但是在执行日期,这是一个合适的日期时间。通常它是在
ds
上完成的,ds是一种字符串表示形式

相反,您需要直接从执行日期中减去,然后按照您想要的方式格式化它

{{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d/%H:%M') }}

为了完整性-该计算只能在模板化sql或模板化sql文件中进行。

理想情况下,您应该在帖子中包含日志中的任何错误消息,这将有助于未来的搜索者,也有助于缩小问题范围

我认为现在的情况是,您使用的是
ds\u add
,但是在执行日期,这是一个合适的日期时间。通常它是在
ds
上完成的,ds是一种字符串表示形式

相反,您需要直接从执行日期中减去,然后按照您想要的方式格式化它

{{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d/%H:%M') }}

为了完整性-该计算只能在模板化sql或模板化sql文件中进行。

IIRC参数值不会被模板化。因此,字符串值被显式传入

您的示例运算符正在加载
import\u orders.sql
。因此,假设您正在使用其中的某个模板宏来加载params dict中的值。宏永远不会递归展开。因此,只需将建议的模板(执行日期减去60天间隔)和所需的字符串格式直接放入具有params宏的sql文件中

例如,如果您的SQL文件看起来像:

SELECT * FROM {{ params.table_name }}
WHERE ID > {{ params.max_Orders_ID_2_months_ago }};
我建议您输入(更正的)宏:


因为
macros.ds_add(ds,-60)
首先只在
%Y-%m-%d
字符串上工作,比如
{ds}
,并且只在
%Y-%m-%d

IIRC中输出字符串,所以参数值不会被模板化。因此,字符串值被显式传入

您的示例运算符正在加载
import\u orders.sql
。因此,假设您正在使用其中的某个模板宏来加载params dict中的值。宏永远不会递归展开。因此,只需将建议的模板(执行日期减去60天间隔)和所需的字符串格式直接放入具有params宏的sql文件中

例如,如果您的SQL文件看起来像:

SELECT * FROM {{ params.table_name }}
WHERE ID > {{ params.max_Orders_ID_2_months_ago }};
我建议您输入(更正的)宏:


因为
macros.ds\u add(ds,-60)
首先只对
%Y-%m-%d
字符串(如
{ds}
)起作用,并且只在
%Y-%m-%d
中输出字符串,所以这也不起作用。这应该替换为我在mysqltologlecloudstorageoperator查询中使用的时间戳。错误是:ProgrammingError:(1064),“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在{(execution_date-macro,这实际上意味着该值没有被重新定义。您可以编辑您的帖子以包含该错误消息以及如何从运算符调用它吗?这也不起作用。这应该替换为我在查询mysqltologlecloudstorageoperator时使用的时间戳。错误是:ProgrammingError:(1064,)您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在“{(execution_date-macro)附近使用的正确语法,这实际上意味着该值未重新编辑。您可以编辑日志以包含该错误消息以及如何从操作调用它吗?您应该尝试放置
{{…
导入模板化的
import\u orders.sql
-我假设它是基于以前的question@Mendhak查看我对Dlamblin的评论我们说直接将其放入SQL文件,只使用
params
传递所需的最基本值,而此计算可以在
.SQL
文件中进行。您应该我试着把
{{…
导入模板化的
import\u orders.sql
-我假设它是基于以前的question@Mendhak查看我对Dlamblin的评论我们说直接将其放入SQL文件,只使用
参数
传递所需的最基本值,而此计算可以在
.SQL
文件中进行。如何放置?当我这样做时:
params={'max_Orders_ID_2_months_ago':'{{(执行日期-macros.timedelta(days=60)).strftime(“%Y-%m-%d%H:%m”)}},'table_name':BQ_table_name},
它给出了
无效语法
@Programmer120这是一个由手机编写的回复,重要的开场白被弄乱了。我修复了它。是的,在你的评论的代码中,
'
是一个空字符串,不与dict
{…}
。您可能应该在venv中安装apache airflow,然后再将代码放入正在运行的系统中
cd$DAGS\u目录;PYTHONPATH=.python-c'从pprint导入pprint;从path.to.dag\u文件导入dag\u变量;pprint(dag\u变量);'
如何放置?当我这样做时:
参数={max\u Orders\ID\u 2个月前]:'{{(执行日期-macros.timedelta(天=60)).strftime(“%Y-%m-%d%H:%m”)}}“”,“表名称”:BQ\U表名称},
它给出了
无效语法
@Programmer120这是一个由手机编写的回复,重要的开场白被弄乱了。我修复了它。是的,在你的评论的代码中,
'
是一个空字符串,不与dict
{…}
。在将代码放入正在运行的系统之前,您可能应该在venv中安装apache airflow