使用psycopg2执行UPDATE后PostgreSQL表未变更的问题排查
问题分析与解决:psycopg2执行UPDATE后字段未变更且无报错
一、直接导致UPDATE失效的语法错误
你的UPDATE语句存在致命语法问题:
原生成的SQL是:
UPDATE PRODUCTS Installation price = price* 0.9 WHERE "group" = "Bakery"; SELECT * FROM PRODUCTS
PostgreSQL的UPDATE语句中,设置字段值必须用SET关键字,你误写为Installation,这会让数据库无法识别UPDATE的赋值逻辑,直接跳过执行这条无效语句,转而执行后面的SELECT,所以你看到查询结果但价格没变化。
正确的UPDATE语句应该是:
UPDATE PRODUCTS SET price = price * 0.9 WHERE "group" = "Bakery"; SELECT * FROM PRODUCTS
二、代码中其他隐藏问题(可能导致异常未被捕获)
- 连接方法的无效代码与异常捕获错误
connect_to_database里有多处错误:
exception应该大写为Exception,否则会触发未定义错误;revert to connector.和not return都是无效代码,会导致方法逻辑混乱;- 缺少游标初始化:你在
foo里直接用self.cursor,但连接方法里没创建这个对象,正常会报错,你没看到报错说明逻辑执行有问题。
修正后的连接方法:
def connect_to_database(self): try: self.conn = psycopg2.connect(**self.db_params) self.cursor = self.conn.cursor() # 必须初始化游标 print("Connected to database.") except (Exception, psycopg2.Error) as error: print(f"Error connecting to PostgreSQL: {error}") return
- SQL注入风险
用f-string拼接用户输入的condition存在严重SQL注入风险,建议改用psycopg2的参数化查询,比如把条件拆成占位符和参数:
# 假设要筛选group为Bakery query = """ UPDATE PRODUCTS SET price = price * 0.9 WHERE "group" = %s; SELECT * FROM PRODUCTS; """ self.cursor.execute(query, ("Bakery",))
三、验证建议
执行前先打印生成的SQL语句,确认语法是否正确:
print(query)
这样能快速排查语句拼接后的语法问题。
内容的提问来源于stack exchange,提问作者Prosmotrum Vidos
相关产品推荐
相关产品推荐

