Python Kivy 从TextField取值更新SQLite指定行数据的实现问题
SQLite 表单行数据更新方案
原代码核心问题
- UPDATE语法错误:标准SQL的UPDATE语法为
UPDATE 表名 SET 字段1=?, 字段2=?... WHERE 筛选字段=?,你当前代码把字段列表和参数位置写反,缺少字段与参数的对应关系,属于语法错误无法执行 - 无指定行筛选逻辑:缺少WHERE后的行匹配规则,执行后会覆盖整张表的所有行数据,完全不符合需求
- 缺少事务提交与资源释放:SQLite默认开启事务,执行更新操作后不调用
commit(),修改不会持久化到数据库;执行完成后未关闭游标和连接会产生资源泄漏 - 冗余代码:开头的
SELECT * FROM sweet没有实际业务用途,可直接删除 - 控件取值问题:如果是PyQt/PySide框架下的输入控件,
text、state都是方法,需要加括号调用才能拿到实际值,比如self.editNames.text()
修正后代码
假设你的sweet表存在主键字段id用于唯一标识每一行,调用editIngredient时需要把待更新行的id作为参数传入,代码如下:
import sqlite3 as sql from time import strftime def editIngredient(self, target_id): # 1. 读取控件取值 names = self.editNames.text() price = self.editPrice.text() quantity = self.editQty.text() pcs = self.editPcs.checkState() # 复选框取值根据实际框架调整 ml = self.editMl.checkState() gram = self.editGram.checkState() comment = self.editComment.text() now = strftime('%Y-%m-%d %H:%M:%S') # 2. 执行数据库更新 con = sql.connect('sweet.db') cur = con.cursor() # 注意WHERE后用id定位唯一行,避免修改全表 cur.execute(""" UPDATE sweet SET names=?, price=?, quantity=?, pcs=?, ml=?, gram=?, comment=?, timeadding=? WHERE id=? """, (names, price, quantity, pcs, ml, gram, comment, now, target_id)) # 提交事务,修改才会生效 con.commit() # 释放资源 cur.close() con.close()
内容的提问来源于stack exchange,提问作者Denis Savishchev
相关产品推荐
相关产品推荐

