导入深度为1的变量作为列表的变量文件时,如何解决InterfaceError?

时间:2019-07-05 06:23:11

标签: airflow

我正在将一个变量文件(例如,variables.json)导入到气流中,该文件的一个depth-1变量是这样的列表:

{...

“ var1”:[“ value1”,“ value2”],

...

}

我尝试了3种方法:

1)。在命令行中:气流变量-i variables.json

2)。在气流界面中,管理员->变量->选择文件->导入变量

3)。在气流界面中,分别是admin->变量->创建->输入键(即Var1)和值(即[“ value1”,“ value2”])。

方法1和2失败,但是方法3成功。

方法1返回的信息类似“ 27个变量中的15个已成功更新。”,这意味着某些变量未成功更新

方法2显示错误: InterfaceError:(sqlite3.InterfaceError)错误绑定参数1-可能不受支持的类型。 [SQL:u'INSERT INTO变量(“ key”,val,is_encrypted)VALUES(?,?,?)'] [参数:(u'var1',[u'value1',u'value2'],0) ](此错误的背景位于:http://sqlalche.me/e/rvf5

我搜索并找到此线程:InterfaceError:(sqlte3.InterfaceError)Error binding parameter 0。 sqlite似乎不支持列表类型。

我还测试了这样一个案例,其中嵌套变量(例如var2_1)是这样的列表

{...

“ var2”:{“ var2_1”:[“ A”,“ B”]},

... }

以上3种方法均有效。

所以我的问题是:

(1)为什么方法1和2失败了,而方法3却成功了,因为depth-1变量是一个列表?

(2)为什么嵌套(depth-2,3,...)变量可以是一个没有任何问题的列表?

2 个答案:

答案 0 :(得分:0)

在您的variable.json中,[“ value1”,“ value2”]是一个数组,其中Airflow需要一个值/字符串或JSON。 如果将该数组转换为JSON中的字符串,则可以使用。

答案 1 :(得分:0)

如果您正在运行Airflow 1.10.3,则CLI中使用的import_helper仅将dict值序列化为JSON

def import_helper(filepath):
    #...
            for k, v in d.items():
                if isinstance(v, dict):
                    Variable.set(k, v, serialize_json=True)
                else:
                    Variable.set(k, v)
                n += 1
        except Exception:
            pass
        finally:
            print("{} of {} variables successfully updated.".format(n, len(d)))

https://github.com/apache/airflow/blob/1.10.3/airflow/bin/cli.py#L376

WebUI导入器也对dict值执行相同的操作。

models.Variable.set(k, v, serialize_json=isinstance(v, dict))

https://github.com/apache/airflow/blob/1.10.3/airflow/www/views.py#L2073

但是,当前版本(1.10.4rc1)显示,在CLI import_helper的将来版本中,非字符串值将被序列化为字符串。

Variable.set(k, v, serialize_json=not isinstance(v, six.string_types))

https://github.com/apache/airflow/blob/1.10.4rc1/airflow/bin/cli.py

...和WebUI导入器。

models.Variable.set(k, v, serialize_json=not isinstance(v, six.string_types))

https://github.com/apache/airflow/blob/1.10.4rc1/airflow/www/views.py#L2118

当前,当您使用CLI或WebUI导入器进行导入时,它将用于在导入过程中执行非字符串值的序列化。

...,当您检索此类变量的值时,请通过选项将其反序列化例如

Variable.get('some-key', deserialize_json=True)