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

如何在psycopg中正确使用WHERE IN语句实现批量查询?

解决psycopg执行IN子句无结果的问题

正确写法一:使用ANY操作符

psycopg会自动将Python列表转换为PostgreSQL数组,配合ANY操作符可直接匹配多个值:

topic_ids = ['1', '4']

with psycopg.connect(os.environ['DB_CONNECTION']) as conn:
    with conn.cursor() as cur:
        sql = "SELECT id FROM topics WHERE topic_id = ANY(%(ids)s)"
        cur.execute(sql, {"ids": topic_ids})
        result = cur.fetchall()  # 得到 [(2,), (21,)]

正确写法二:直接传入元组给IN子句

用%s作为占位符,将topic_ids转换为元组传入,psycopg会自动展开为IN所需的多个占位符:

topic_ids = ['1', '4']

with psycopg.connect(os.environ['DB_CONNECTION']) as conn:
    with conn.cursor() as cur:
        sql = "SELECT id FROM topics WHERE topic_id IN %s"
        cur.execute(sql, (tuple(topic_ids),))
        result = cur.fetchall()  # 得到 [(2,), (21,)]

原写法无结果的原因

你之前的写法IN (%(ids)s),当传入元组('1','4')时,psycopg会将其处理为单个字符串值'(1,4)',相当于执行了SELECT id FROM topics WHERE topic_id = '(1,4)',而表中没有匹配该值的记录,所以返回空结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:27:40