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
相关产品推荐
相关产品推荐

