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

Airflow 当导入一个深度为1的变量为列表的变量文件时,如何解决InterfaceError?,airflow,Airflow,我正在将一个变量文件(例如variables.json)导入到airflow中,其中一个depth-1变量是如下列表: { “var1”:[“value1”、“value2”] } 我尝试了3种方法: 1) 。命令行中:气流变量-i variables.json 2) 。在用户界面中,管理->变量->选择文件->导入变量 3) 。在airflow UI中,分别是admin->Variables->Create->input key(即Var1)和value(即[“value1”、“value2

我正在将一个变量文件(例如variables.json)导入到airflow中,其中一个depth-1变量是如下列表:

{

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

}

我尝试了3种方法:

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

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

3) 。在airflow UI中,分别是admin->Variables->Create->input key(即Var1)和value(即[“value1”、“value2”)

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

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

方法2显示错误: InterfaceError:(sqlite3.InterfaceError)绑定参数1时出错-可能是不支持的类型。[SQL:u'INSERT-INTO-variable(“key”,val,是加密的)值(?,,?)'][parameters:(u'var1',[u'value1',u'value2'],0)](此错误的背景信息位于:)

我搜索并找到此线程:。 sqlite似乎不支持列表类型

我还测试了一个嵌套变量(例如,这里的var2_1)为如下列表的情况

{

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

。。。 }

以上三种方法均有效

因此,我的问题是:

(1) 为什么方法1和2失败了,但对于作为列表的深度1变量,方法3成功了

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

在variable.json中,[“value1”、“value2”]是一个数组,其中需要值/字符串或json。 如果您将该数组强制转换为JSON中的字符串,它将起作用。

在variable.JSON中,[“value1”、“value2”]是一个数组,其中需要值/字符串或JSON。
如果您将该数组强制转换为JSON中的字符串,它将起作用。

如果您运行的是Airflow 1.10.3,CLI中使用的
import\u helper
仅将
dict
值序列化为
JSON

def导入辅助程序(文件路径):
#...
对于d.项()中的k,v:
如果存在(v,dict):
set(k,v,serialize_json=True)
其他:
变量集(k,v)
n+=1
除例外情况外:
通过
最后:
打印({}个{}变量已成功更新。“.format(n,len(d)))

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

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

但是,当前版本(1.10.4rc1)显示,在CLI的未来版本中,非字符串值将序列化为字符串
import\u helper

Variable.set(k,v,serialize_json=not isinstance(v,six.string_类型))

…和WebUI导入程序

models.Variable.set(k,v,serialize_json=not isinstance(v,six.string_类型))

目前,当您使用CLI或WebUI导入器进行导入过程中非字符串值的序列化时,它将为您提供服务

…当您检索此类变量的值时,请传递反序列化它们的选项,例如

Variable.get('some-key',反序列化\u json=True)

如果您运行的是Airflow 1.10.3,CLI中使用的
import\u helper
仅将
dict
值序列化为
JSON

def导入辅助程序(文件路径):
#...
对于d.项()中的k,v:
如果存在(v,dict):
set(k,v,serialize_json=True)
其他:
变量集(k,v)
n+=1
除例外情况外:
通过
最后:
打印({}个{}变量已成功更新。“.format(n,len(d)))

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

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

但是,当前版本(1.10.4rc1)显示,在CLI的未来版本中,非字符串值将序列化为字符串
import\u helper

Variable.set(k,v,serialize_json=not isinstance(v,six.string_类型))

…和WebUI导入程序

models.Variable.set(k,v,serialize_json=not isinstance(v,six.string_类型))

目前,当您使用CLI或WebUI导入器进行导入过程中非字符串值的序列化时,它将为您提供服务

…当您检索此类变量的值时,请传递反序列化它们的选项,例如

Variable.get('some-key',反序列化\u json=True)

谢谢您的回复,深呼吸。如果列表被转换成字符串,当然不会导致InterfaceError问题。但是,如何使用python for循环来获取单个元素(这里是“value1”、“value2”)?我认为将字符串解析回列表不是一个好主意。谢谢你的回复,呼吸。如果列表被转换成字符串,当然不会导致InterfaceError问题。但是,如何使用python for循环来获取单个元素(这里是“value1”、“value2”)?我认为将字符串解析回列表不是一个好主意。非常好的解释。我公司现有的代码似乎太旧了:仍在使用airflow 1.8.2:(.还有一个问题我忘了问:为什么方法3(即在airflow UI中,管理->变量->创建->分别输入键和值)handle list变量在旧版本中没有问题?与其他方法不同,方法3负责将值序列化为字符串。非常好的解释。我公司现有的代码似乎太旧了:仍在使用airflow 1.8.2,:(。还有一个问题我忘了问:为什么方法3可以(即,在airflow UI中,管理->变量->创建->分别输入键和值)处理旧版本中没有问题的列表变量?方法3处理serializi