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

使用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

二、代码中其他隐藏问题(可能导致异常未被捕获)

  1. 连接方法的无效代码与异常捕获错误
    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
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:40:24