如何将PostgreSQL数组值作为参数传递给asyncpg的connection.execute方法
问题原因说明
为什么第二个字符串参数会被拒绝
asyncpg内置了PostgreSQL数据类型和Python数据类型的自动映射规则:
- 表中
nested_field是varchar类型,对应Python的str类型,所以第一个字符串参数可以正常通过校验 - 表中
subfields是varchar[]数组类型,asyncpg要求传入对应Python可迭代容器(最常用的就是列表),它会自动完成到PostgreSQL数组格式的转换。你手动拼接的'{...}'格式的字符串不符合类型预期,因此抛出了类型不匹配的错误。
修复方案
你完全不需要手动构造数组格式的字符串,直接按以下步骤修改即可:
- 删掉你自定义的
from_list_to_stringified_set转换函数,该操作完全多余,反而会引发类型错误 - 注意你给出的
list_of_subfields = ["one, two, three"]是只有一个元素的列表,如果你要存三个独立的元素,需要写成list_of_subfields = ["one", "two", "three"] - 修正你的插入SQL的字段名,要和表定义对齐:你表定义里对应第一个值的字段是
nested_field,你写的SQL里先后用了thing、title,字段不匹配也会引发报错 - 直接把Python列表作为第二个参数传入
execute方法即可
修改后的代码示例:
# 修正字段名和表定义对齐 query = """ INSERT INTO my_table(nested_field, subfields) VALUES($1, $2); """ list_of_subfields = ["one", "two", "three"] try: # 直接传列表即可,asyncpg会自动处理数组转换 await connection.execute(query, "something", list_of_subfields) return None except (Exception, asyncpg.UniqueViolationError) as integrError: # 原有处理逻辑保留 except (Exception, asyncpg.ConnectionFailureError) as error: # 原有处理逻辑保留 finally: # 原有处理逻辑保留
这种方式不仅解决了类型报错问题,asyncpg的内置类型转换还会自动处理特殊字符转义,避免你手动拼接字符串可能带来的SQL注入风险。
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

