Python 如何在气流中扩展模板上下文?

Python 如何在气流中扩展模板上下文?,python,airflow,directed-acyclic-graphs,Python,Airflow,Directed Acyclic Graphs,如何将新键添加到为模板(即)提供的上下文中?我在源代码中查找了解决方案,但找不到我自己 在命名模板参数时,我必须适应外部约束(start\u date和end\u date)。和不适用,因为它们将提供函数,而不是要替换的求值(即必须在模板中写入{{start_date()}}而不是{{start_date}}。 我已尝试使用,但无法修改上下文 TaskInstance类的get\u template\u context()方法返回中的字典,该字典将成为模板化的上下文。似乎除了修补气流源之外,没有

如何将新键添加到为模板(即)提供的上下文中?我在源代码中查找了解决方案,但找不到我自己

在命名模板参数时,我必须适应外部约束(
start\u date
end\u date
)。和不适用,因为它们将提供函数,而不是要替换的求值(即必须在模板中写入
{{start_date()}}
而不是
{{start_date}}

我已尝试使用,但无法修改上下文


TaskInstance
类的
get\u template\u context()
方法返回中的字典,该字典将成为模板化的上下文。似乎除了修补气流源之外,没有其他方法可以扩展(update())这本词典,我希望避免这种情况。

您可以对sql文件使用开箱即用的模板。例如,您可以使用:

select * from table1 where created between "{{params.start_date}}" and "{{params.end_date}}"
并在任务定义中给出参数:

task = PostgresOperator(task_id='task_name',
                               sql="sql/delete_and_copy.sql",
                               postgres_conn_id="postgres_connection",
                               database="dev",
                               params={
                                          'start_date': start_date,
                                          'end_date': end_date,
                                      },
                                      )
开始日期和结束日期可以由Python操作符计算。

您可以对sql文件使用现成的模板。例如,您可以使用:

select * from table1 where created between "{{params.start_date}}" and "{{params.end_date}}"
并在任务定义中给出参数:

task = PostgresOperator(task_id='task_name',
                               sql="sql/delete_and_copy.sql",
                               postgres_conn_id="postgres_connection",
                               database="dev",
                               params={
                                          'start_date': start_date,
                                          'end_date': end_date,
                                      },
                                      )
开始日期和结束日期可以由Python操作符计算。

你能给出一个代码示例来解释你想做什么吗?例如q1.sql文件将包含以下查询:
从表1中选择*在“{start\u date}}”和“{end\u date}}”之间创建。
q1.sql的内容是给定的,我不能更改它。我必须传递
开始日期
结束日期
参数。这是一个很琐碎的任务,用香草金酒2。我无法提前渲染它,因为task_instance/execution_date仅在执行时可用。因此您希望传递名为start_date&end_date的用户值以在任务中渲染,但不希望遵守此约定?我可以问一下是什么阻止您读取SQL文件并修改它以满足用户定义宏的要求吗?我有一个客户端和一个自定义的遗留系统来回填这些查询,因为Airflow 1.x在每天安排这些查询时非常慢。当然,可能有多种解决方案,但在这个问题上,我们将解决一个不同的问题。我可以重写遗留系统以支持模板化,并使这两个系统的工作复杂化(即应用函数而不是简单的变量来支持范围查询)。我倾向于修补程序,并添加一个
用户定义的变量
,以干净的方式扩展上下文,其中可调用的变量将事先进行评估。您能给出一个代码示例来解释您想要做什么吗?例如,q1.sql文件将包含以下查询:
从表1中选择*,其中创建了{{start_date}}和“{end_date}”
q1.sql的内容已经给出,我无法更改它。我必须传递
start\u date
end\u date
参数。使用vanilla Jinja2做这项任务很简单。我无法提前渲染它,因为任务实例/执行日期仅在执行时可用。所以您希望传递名为start\u date和end\u date的用户值要在任务中呈现,但您不想遵守Airflow约定?我可以问一下,是什么阻止您读取SQL文件并对其进行修改以满足用户定义宏的要求?我有一个客户端和一个自定义遗留系统来回填这些查询,因为Airflow 1.x每天安排这些查询的速度非常慢。当然有可能有多种解决方案,但我们会解决这个问题中的另一个问题。我可以重写旧系统以支持模板,并使两个系统的事情复杂化(即应用函数而不是简单的变量来支持范围查询)。我倾向于修补气流,并添加一个
用户定义的变量
,以干净的方式扩展上下文,可调用的变量将事先进行评估。如果我理解正确,我应该在每个工作流/DAG的开头插入一个任务,将开始日期/结束日期推送到XCom中,并从该任务中拉出?或者还有其他任务在我不知道的两个后续任务之间传递值的方法?开始日期和结束日期应从任务实例的执行日期开始计算。目标是保持模板完整,并使用
{start\u date}
{end\u date}
因为其他程序也在使用这些模板。如果我理解正确,我应该在每个工作流/DAG的开头插入一个任务,将开始日期/结束日期推送到XCom并从该任务中提取?或者有其他方法在我不知道的两个后续任务之间传递值?开始日期和结束日期应该是计算的从任务实例的执行日期开始计算。目标是保持模板完整,并使用
{{start\u date}
{{end\u date}}
,因为其他程序也在使用这些模板。