我们可以在Airflow postgress参数中传递数组列表吗?
我正在尝试类似
Select hotel_name from hoteldetails where id in ({{ params.hotel_ids }});
在“ s3_to_redshift.sql
”中。
下面是我的运算符::
s3_to_redshift = PostgresOperator(
task_id='s3_to_redshift',
postgres_conn_id='redshift',
sql='s3_to_redshift.sql',
params={'hotel_ids': [1,2,3]},
dag=dag
)
答案 0 :(得分:1)
可以,但是您必须担心参数将如何呈现。在这种情况下,您要传递数组并直接在SQL语句中呈现它。这将在SQL语句中打印[1, 2, 3]
,这当然不是有效的SQL。
Airflow使用Jinja渲染模板。为了获得正确的SQL语句,您可以在Jinja中使用for loops来渲染参数。 Airflow还支持添加您自己的功能以在Jinja中使用。这意味着您需要创建一个Airflow plugin。例如,您可以添加以下宏:
def render_list_sql(list):
return ', '.join(list)
如果将此作为插件正确导入,则您的sql模板将变为以下内容:
Select hotel_name from hoteldetails where id in ({{ macros.render_list_sql(params.hotel_ids) }});