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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:18:03