Airflow 元组索引在XCom中超出范围
我正在使用Airflow和XCOM,希望从函数返回多个值,但是,我面临着这个问题。以下是我的代码:Airflow 元组索引在XCom中超出范围,airflow,airflow-scheduler,apache-airflow-xcom,Airflow,Airflow Scheduler,Apache Airflow Xcom,我正在使用Airflow和XCOM,希望从函数返回多个值,但是,我面临着这个问题。以下是我的代码: def authenticate_api(): #Define the global variables # API authentication url = 'odoo' db = 'db' username = 'admin' password = 'user' logging.info("Variables assigned")
def authenticate_api():
#Define the global variables
# API authentication
url = 'odoo'
db = 'db'
username = 'admin'
password = 'user'
logging.info("Variables assigned")
common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url))
return db, models, uid, password
def get_max_date_from_odoo(**context):
# Variables
list = []
list2 = []
db = context['task_instance'].xcom_pull(key=None, task_ids='authenticate_api')
models = context['task_instance'].xcom_pull(key=None, task_ids='authenticate_api')
uid = context['task_instance'].xcom_pull(key=None, task_ids='authenticate_api')
password = context['task_instance'].xcom_pull(key=None, task_ids='authenticate_api')
#Get the customer id and date to use in the query
datesandids = models.execute_kw(db, uid, password,
'res.partner', 'search_read',
[[['is_company', '=', False]]],
{'fields': ['x_customer_register_date', 'x_customer_id']})
它返回:
('database', <ServerProxy for odoo069/xmlrpc/2/object>, 1, '1234')
您将返回包含所有值的元组,并将其分配给所有变量,而不是获取单个值 试试这个:
def get_max_date_from_odoo(**context):
# Variables
list = []
list2 = []
db, models, uid, password = context['task_instance'].xcom_pull(key=None, task_ids='authenticate_api')
...
这应该可以节省您点击数据库4次以获得相同的值
或者,因为我们不确定从XCOM返回的类型(预期的元组,可以是json编码的)
我看到了索引器,但您不能调用
int(params[1])
,因为params[1]=
def get_max_date_from_odoo(**context):
# Variables
list = []
list2 = []
db, models, uid, password = context['task_instance'].xcom_pull(key=None, task_ids='authenticate_api')
...
def get_max_date_from_odoo(**context):
# Variables
list = []
list2 = []
values = context['task_instance'].xcom_pull(key=None, task_ids='authenticate_api')
if isinstance(values, tuple):
db, models, uid, password = values
elif isinstance(values, str):
import json
values = json.loads(values)
db, models, uid, password = values