如何将带有参数的SQL作为文件传递给Airflow Operator

时间:2018-10-07 13:03:25

标签: airflow

我在气流中有一位操作员:

ICRNL

现在,我需要运行的实际查询长度为24行。我想将其保存在文件中,并为操作员提供SQL文件的路径。操作员支持此操作,但是我不确定该如何处理需要SQL的参数。

建议?

编辑: 这是我的代码:

import_orders_op = MySqlToGoogleCloudStorageOperator(
    task_id='import_orders',
    mysql_conn_id='con1',
    google_cloud_storage_conn_id='con2',
    provide_context=True,
    sql="""SELECT * FROM orders where orderid>{0}""".format(parameter),
    bucket=GCS_BUCKET_ID,
    filename=file_name,
    dag=dag) 

这给出了:

  

jinja2.exceptions.UndefinedError:'templates_dict'未定义

1 个答案:

答案 0 :(得分:3)

您已经注意到,MySqlToGoogleCloudStorageOperator指定一个扩展名为.sql的template_ext

首先在您的Dag中,指定放置.sql文件的路径

dag = DAG('my_dag', default_args=default_args, schedule_interval="30 7 * * *", template_searchpath = ['/home/ubuntu/airflow/.../myfolder'])

在yourfile.sql中输入大型查询。请注意params.ord_id

SELECT * FROM orders where orderid> {{ params.ord_id }}

现在在运算符的sql参数中,传递文件名。

import_orders_op = MySqlToGoogleCloudStorageOperator(
    task_id='import_orders',
    mysql_conn_id='con1',
    google_cloud_storage_conn_id='con2',
    provide_context=True,
    sql='yourfile.sql',
    params={"ord_id":99},
    bucket=GCS_BUCKET_ID,
    filename=file_name,
    dag=dag) 

请不要在该文件名后添加空格,这一点很重要。这是因为Jinja模板引擎将查找以.sql结尾的字符串,如果这样做,它将把它视为文件而不是字符串。