如何在Python psycopg2中对uuid数组使用IN条件参数化查询
错误原因
你的参数化写法报错核心有两点:
- 你把多个UUID拼接成单个字符串作为参数传入,psycopg2会把这个整体当做单个字段值处理,数据库会尝试把整个长串转成UUID类型,自然匹配失败
- 参数化查询时不需要手动给字符串加引号,psycopg2会自动根据字段类型处理转义和引号包裹
- 额外注意:你参数化写法里的表名写的是
testdb,和实际建表的test_db不一致,也会引发额外报错
正确实现方案
方案1:动态生成IN子句占位符
根据待查询的UUID数量动态生成对应个数的%s占位符,再把UUID列表作为参数传入即可:
# 待查询的UUID列表,不需要手动加引号 uuid_list = [ "5ed11bbf-ffd1-4124-ba3d-5e392dc9db96", "14acfb5b-3b09-4728-b3b3-8cd484b310db" ] # 动态生成占位符,2个UUID就生成 %s,%s placeholders = ','.join(['%s'] * len(uuid_list)) # 执行查询 cursor.execute(f"SELECT * FROM test_db WHERE id IN ({placeholders})", tuple(uuid_list))
方案2:配合ANY操作符传数组(更推荐)
psycopg2原生支持Python列表和PostgreSQL数组的类型转换,用ANY操作符不需要动态拼接SQL结构,代码更简洁且无注入风险:
uuid_list = [ "5ed11bbf-ffd1-4124-ba3d-5e392dc9db96", "14acfb5b-3b09-4728-b3b3-8cd484b310db" ] # 直接传列表作为参数即可 cursor.execute("SELECT * FROM test_db WHERE id = ANY(%s)", (uuid_list,))
内容的提问来源于stack exchange,提问作者Yanbin
相关产品推荐
相关产品推荐

