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

psycopg2执行PostgreSQL DISTINCT查询结果不符合预期如何修正

问题原因

你现在遇到的问题是psycopg2的参数绑定规则导致的:cursor.execute()的第二个参数传入的所有值都会被当作查询值处理,而不会被识别为SQL标识符(列名、表名等)。
你现在的写法实际执行的SQL等价于:

SELECT DISTINCT 'state' FROM example_table

等于你每一行都返回常量字符串'state',去重后自然只有('state',)这一个结果,和你预期的查询state列的内容完全不同。

解决方法

分两种场景处理:

场景1:查询的列名固定为state

直接把列名写死在SQL语句中即可,不需要用参数传递列名:

import psycopg2 as ps
con = ps.connect("dbname=example_db user=user password=password")
cursor = con.cursor()
# 直接把列名写在SQL里,不需要传参
cursor.execute('SELECT DISTINCT state FROM example_table')
results = cursor.fetchall()

场景2:查询的列名是动态变量

不要手动拼接SQL字符串(会有SQL注入风险),使用psycopg2内置的sql模块处理标识符:

import psycopg2 as ps
from psycopg2 import sql

con = ps.connect("dbname=example_db user=user password=password")
cursor = con.cursor()
# 用sql.Identifier标记内容为SQL标识符(列/表名)
query = sql.SQL('SELECT DISTINCT {} FROM example_table').format(
    sql.Identifier('state') # 这里可以替换成动态的列名变量
)
cursor.execute(query)
results = cursor.fetchall()

两种写法都可以返回和PGAdmin4执行结果一致的去重列值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:07