如何将昨日日期作为参数传递给Airflow任务 解决手动触发取值异常
问题根因
prev_execution_date的取值是当前DAG实例上一次成功运行对应的逻辑执行时间,和自然日的「昨日」没有绑定关系。手动触发DAG时,如果该DAG没有历史调度运行记录,Airflow会默认将prev_execution_date赋值为当前触发时刻的时间,自然无法返回预期的昨日日期。
可行解决方案
根据使用场景选择对应方案即可:
- 方案1:基于逻辑日期偏移计算(适配所有触发场景,稳定性最高)
放弃依赖prev_execution_date,直接通过Airflow内置的execution_date(当前DAG实例的逻辑时间,语义不受触发方式影响)做日期偏移,将原有模板代码替换为:
只要DAG运行对应的逻辑日期为当日,无论定时调度还是手动触发,该模板都会稳定返回自然日的昨日日期,不会因为缺少历史运行记录出错。{{ (execution_date - macros.timedelta(days=1)).strftime('%Y-%m-%d') }} - 方案2:手动触发时指定逻辑日期(适配需要保留原有
prev_execution_date逻辑的场景)
手动触发DAG时,在触发配置弹窗中取消默认勾选的「Run as of now」选项,将逻辑日期(旧版本称Execution date)手动设置为当日的调度周期时间,此时Airflow会按照标准调度逻辑计算相邻运行的时间差,prev_execution_date就会正确返回前一天日期。 - 方案3:代码内直接计算自然日(适配Python自定义任务场景)
如果任务是Python实现的业务逻辑,不需要依赖模板传参,可以直接在任务代码内计算昨日日期,完全绕开Airflow模板变量的逻辑限制:
该写法无论DAG以何种方式触发,都会取任务运行时刻的自然昨日,适合不需要做历史数据回溯、仅处理每日增量的任务。from datetime import datetime, timedelta def your_task_func(**context): yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') # 后续业务逻辑直接调用yesterday变量即可
内容的提问来源于stack exchange,提问作者upendra kilaru
相关产品推荐
相关产品推荐

