【发布时间】:2021-01-03 19:22:22
【问题描述】:
我在使用 sqlalchemy 更新表示雪花表的 python 模型时遇到问题。其中一列是变体字段,当我尝试更新模型并将其保存回数据库时,雪花抱怨该值不是变体。我尝试将数据作为字典和 json 字符串传递,但都不起作用。
模型属性定义为:
data = db.Column(snowsql.VARIANT)
snowsql 是 snowflake-sqlalchemy 包的别名,该包已安装,但似乎只提供类型方言,而没有提供其他功能。
有人有这方面的经验吗?
更新:
我添加的数据是一个 python 字典列表:
new_data['data'] = [{'component': None, 'display_name': 'blah', 'key': None, 'row': {'display_name': 'blah', 'type': 'blah'}, 'sub_type': None, 'type': 'blah'}]
设置变体属性时执行 json.dumps:
new_blah = Blah(
data = json.dumps(new_data['data'])
)
结果:
表达式类型与列数据类型不匹配,应为 VARIANT,但为 DATA 列得到 VARCHAR(8905)
转储生成的 json:
"[{\"component\":null,\"display_name\":\"blah\",\"key\":null,\"row\":{\"display_name\":\"blah\",\"type\":\"blah\"},\"sub_type\":null,\"type\":\"blah\"}]"
或者,尝试在不执行 json.dumps 的情况下分配列表:
sqlalchemy.exc.ProgrammingError: (snowflake.connector.errors.ProgrammingError) 252004: None: 处理pyformat-parameters失败; 'dict' 对象没有属性 'replace'
【问题讨论】:
-
确保您传入的值是 JSON 而不是字符串。您能否分享您尝试传递到 Variant 字段的值?
-
更新了数据结构。它是 python,所以我只是在做一个 json.dumps 来生成一个 json 格式的字符串。
-
改用 json.load() 试试。我相信 json.dumps 正在把东西变成一个字符串,而你希望它是一个 json 有效负载。我好像记得以前有这个问题,所以如果 json.load() 没有帮助,我会为你挖掘代码。
-
我无法对列表进行加载,因为它是一个 python 对象并且只能解析 json 字符串。结果是:TypeError: JSON object must be str, bytes or bytearray, not 'list'
-
我可以确认这只是一个插入问题,如果我用完全相同的 json.dumps 更新现有行,它可以正常工作。
标签: python sqlalchemy snowflake-cloud-data-platform variant