气流jinja模板:获取参数或执行日期(ds_nodash)

时间:2020-06-06 23:02:05

标签: python jinja2 airflow

在我的模板(XXX.sql)中,我有:

{{ params.etl_date if params.etl_date is not none else execution_date.strftime('%Y%m%d') }}

然后在我的BigQueryOperator中:

BigQueryOperator(task_id='XXX',
                 bigquery_conn_id=GOOGLE_CLOUD_PLATFORM_CONNECTION_ID,
                 write_disposition='WRITE_TRUNCATE',
                 create_disposition='CREATE_IF_NEEDED',
                 sql='XXX.sql',
                 schema=None,
                 use_legacy_sql=False,
                 destination_dataset_table=XXX,
                 params={
                   'etl_date': '20200605'
                 })

它可以工作,但可以:

BigQueryOperator(task_id='XXX',
                 bigquery_conn_id=GOOGLE_CLOUD_PLATFORM_CONNECTION_ID,
                 write_disposition='WRITE_TRUNCATE',
                 create_disposition='CREATE_IF_NEEDED',
                 sql='XXX.sql',
                 schema=None,
                 use_legacy_sql=False,
                 destination_dataset_table=XXX,
                 # NO PARAMS
                 )

我似乎可以访问并格式化执行日期?它只是返回一个空字符串。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

在第二种情况下,您可以设置:

params={ 'etl_date': None}

答案 1 :(得分:1)

要添加到Sergiy的响应中,这取决于您要进行干预的位置。 Sergiy's是它与模板一起工作的唯一方法:

{{ params.etl_date if params.etl_date is not None else execution_date.strftime('%Y%m%d') }}

在这种情况下,您必须提供明确的None来提供它的原因是由于可以安全地解释和渲染模板。在dictionary.get(key, "")下有一个与params.etl_date等效的...只是因为在构建字符串或文本模板时这是安全的。

您可能想做的就是明确使用它,并将模板更改为:

{{ params.etl_date if params.etl_date else execution_date.strftime('%Y%m%d') }}

这是因为params.etl_date默认返回的空字符串将被Python评估为False