You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用psycopg3实现PostgreSQL数组包含查询?

PostgreSQL数组字段匹配全部标签的psycopg3实现问题

我的PostgreSQL 14数据库中有一张表,包含字符串数组类型字段tags TEXT[]。我在Python中有一个字符串列表["foo", "bar"],想要查询表中包含该列表所有标签的行。

我期望执行的SQL语句是:SELECT * FROM mytable WHERE tags @> ARRAY['foo', 'bar'],但使用psycopg3模块无法正确生成这条语句。

当前代码如下:

sqlcmd = "SELECT * FROM mytable WHERE tags @> ARRAY[%(tags)s]"
params = {"tags": ["foo", "bar"]}

cursor = conn.cursor()
print(cursor.mogrify(sqlcmd, params))
#=> SELECT * FROM mytable WHERE tags @> ARRAY['{foo,bar}']

当只传入单个标签时,生成的语句为… tags @> ARRAY['{foo}']。


解决方法

psycopg3会自动把Python列表转换为PostgreSQL的数组类型,不需要手动用ARRAY[]包裹参数——否则会导致嵌套数组问题(生成的ARRAY['{foo,bar}']是把数组格式的字符串当成了单个元素)。

正确的写法直接将参数作为数组使用:

sqlcmd = "SELECT * FROM mytable WHERE tags @> %(tags)s"
params = {"tags": ["foo", "bar"]}

cursor = conn.cursor()
print(cursor.mogrify(sqlcmd, params))
#=> SELECT * FROM mytable WHERE tags @> ARRAY['foo','bar']

这里的@>操作符是PostgreSQL中判断数组包含关系的正确用法,确保返回的行包含你传入的所有标签。


内容的提问来源于stack exchange,提问作者Phrogz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:57:06