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")

我正在使用Airflow和XCOM,希望从函数返回多个值,但是,我面临着这个问题。以下是我的代码:

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