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

