我有以下工作流程:
MySqlToGoogleCloudStorageOperator
的sql命令。现在,事实证明这很困难。
这是我的代码:
VALUE_FROM_VARIABLE = Variable.get("my_var")
query = 'SELECT ... FROM orders where orders_id>{0}
and orderid<{1};'.format(VALUE_FROM_MySqlOperator, VALUE_FROM_VARIABLE)
file_name = ...
import_orders_op = MySqlToGoogleCloudStorageOperator(
task_id='import_orders_and_upload_to_storage',
mysql_conn_id='mysql_con',
google_cloud_storage_conn_id='gcp_con',
sql=query,
bucket=GCS_BUCKET_ID,
filename=file_name,
dag=dag)
我的问题是我无法访问MySqlOperator
XCOM,它存储了查询所需的号码。
因此,我尝试在PythonOperator
中访问它,并按如下方式构建查询字符串:
def func(ds, **kwargs):
ti = kwargs['ti']
VALUE_FROM_MySqlOperator = str(ti.xcom_pull(task_ids='mySQL_task')) # get the XCOM of MySqlOperator
query = 'SELECT ... FROM orders where orders_id>{0}
and orderid<{1};'.format(VALUE_FROM_MySqlOperator, VALUE_FROM_VARIABLE)
return query
py_op = PythonOperator(
task_id='py_op_task',
provide_context=True,
python_callable=func,
xcom_push=True,
dag=dag)
但是现在我无法将新生成的查询传递给MySqlToGoogleCloudStorageOperator
,因为我无法读取此运算符中的XCOM。
我该如何摆脱呢?
答案 0 :(得分:0)
SQL运算符打算执行不返回任何值的查询。您可以使用此类运算符(例如)将数据从舞台表移至生产环境。
我认为,请避免创建使用XCOMS的工作流。
如果需要从数据库查询数据,可以使用Hooks和Connections
未经测试的代码在下面
VALUE_FROM_VARIABLE = Variable.get("my_var")
query_to_retrieve = "SELECT item FROM table"
from airflow.hooks.mysql_hook import MySqlHook
#here we importing hook, using connection and get first row
VALUE_FROM_MySQL = MySqlHook(mysql_conn_id='mysql_default').get_first(query_to_retrieve)[0]
query = 'SELECT ... FROM orders where orders_id>{0}
and orderid<{1};'.format(VALUE_FROM_MySQL, VALUE_FROM_VARIABLE)