使用psycopg2查询PostgreSQL时出现UndefinedColumn错误求助
问题修复:psycopg2执行SELECT查询时的UndefinedColumn错误
错误原因
PostgreSQL中,双引号(") 用于引用标识符(比如表名、列名),你把字符串值123-45-6789用双引号包裹,导致数据库将其识别为列名,从而抛出UndefinedColumn错误。
修复方案
方案1:修正引号使用
将WHERE子句中的值改用单引号(')包裹,同时保留列名的双引号(适配大小写敏感的列名"SSN"):
import psycopg2 con = psycopg2.connect(database="dbname",user="postgres",password="pwd",host="localhost",port= '5432') cursor_obj = con.cursor() # 将查询值改为单引号包裹 x = 'select "*" FROM PUBLIC."tab1" ' y = 'where "SSN"=\'123-45-6789\' ' a = x + y cursor_obj.execute(a) result = cursor_obj.fetchall() print("Result set:\n", result) con.close()
注意:SELECT是只读操作,无需调用con.commit()。
方案2:使用参数化查询(推荐)
这是psycopg2的最佳实践,既能彻底避免引号问题,又能防止SQL注入:
import psycopg2 con = psycopg2.connect(database="dbname",user="postgres",password="pwd",host="localhost",port= '5432') cursor_obj = con.cursor() # 使用%s作为占位符,参数单独传入execute方法 query = 'select "*" FROM PUBLIC."tab1" where "SSN" = %s' cursor_obj.execute(query, ('123-45-6789',)) result = cursor_obj.fetchall() print("Result set:\n", result) con.close()
参数化查询会自动处理字符串的引号转义,无需手动拼接SQL语句,安全性和可读性更强。
内容的提问来源于stack exchange,提问作者Murali Kumar
相关产品推荐
相关产品推荐

