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

Python中SQLite UPDATE语句不生效问题排查求助

问题排查与解决方案

你的问题根源在于SQLite事务未提交,加上连接过早关闭的问题,导致数据库更新没有实际生效。下面一步步拆解并解决:

1. 核心原因:未提交事务

Python的sqlite3模块默认会开启事务,所有写操作(UPDATE/INSERT/DELETE)都需要手动调用conn.commit()才能将改动持久化到数据库。如果不提交,当连接关闭时事务会自动回滚,你的更新操作相当于白执行了。

2. 次要问题:过早关闭数据库连接

你在add_to_cart方法里执行完更新就立刻调用conn.close(),这会导致后续任何需要数据库连接的操作(比如再次查询商品、添加其他商品)直接报错。数据库连接应该在整个程序生命周期内保持打开,直到程序结束时再关闭。

修改后的代码片段

修复add_to_cart方法

def add_to_cart(self):
    products_list.append(self.product)
    quantity_list.append(self.qne.get())
    price_list.append(int(self.qne.get()) * int(self.cost))
    value1 = int(self.stock) - int(self.qne.get())
    # 改用参数化查询,避免SQL注入,同时更安全简洁
    sql = "UPDATE products SET stock = ? WHERE pk = ?"
    conn.execute(sql, (value1, self.ident.get()))
    # 提交事务,让数据库改动生效
    conn.commit()
    # 不要在这里关闭连接!
    
    t = 150
    i = 0
    for p in products_list:
        self.pr1 = Label(self.right, text=str(products_list[i]), font=('arial 16 bold'), bg='steelblue', fg='white').place(x=0, y=t)
        self.pr2 = Label(self.right, text=(str(quantity_list[i])), font=('arial 16 bold'), bg='steelblue', fg='white').place(x=120, y=t)
        self.pr3 = Label(self.right, text=(str(price_list[i])), font=('arial 16 bold'), bg='steelblue', fg='white').place(x=240, y=t)
        t += 40
        i += 1
    print(str(products_list) + str(quantity_list)+ str(price_list))

程序结束时统一关闭连接

把连接关闭的代码移到主循环结束后,确保程序退出时才关闭连接:

root.mainloop()
# 程序结束后关闭数据库连接
conn.close()

额外优化建议:使用参数化查询

我把你原来拼接SQL的方式改成了参数化查询,这样做的好处:

  • 彻底避免SQL注入攻击,让代码更安全
  • 不用手动处理字符串转义,减少格式错误的概率
  • 代码结构更整洁易读

现在再测试更新库存的操作,应该就能正常生效了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:18:47