Python-SQLite技术问询:如何更新两条标识值相同的记录
解决Python操作SQLite更新同标识多条磁盘记录的问题
Got it,我来帮你搞定这个需求——用Python更新SQLite中disk表里属于同一客户端的两条磁盘记录。先梳理下原代码里的几个小问题,再给你完整的实现方案:
关键前提
首先要确保disk表有一个关联字段(比如client_ip),用来和clientinfo表的IP字段绑定,这样才能定位到要更新的是哪个客户端的磁盘数据。如果你的disk表还没这个字段,先执行这条SQL添加:
ALTER TABLE disk ADD COLUMN client_ip TEXT;
完整实现代码
import psutil import sqlite3 # 模拟的磁盘数据(和你提供的一致) DISK = { '1': ['C:\\', 'C:\\', 'NTFS', 'rw,fixed', '75.0Gb', '54.0Gb', '20.0Gb', '72.2%'], '2': ['D:\\', 'D:\\', 'NTFS', 'rw,fixed', '399.0Gb', '208.0Gb', '191.0Gb', '52.2%'] } target_ip = "192.168.10.111" conn = sqlite3.connect("Test.db") c = conn.cursor() try: # 先确认目标客户端存在(优化原代码的判断逻辑,更高效) c.execute("SELECT * FROM clientinfo WHERE IP = ?", (target_ip,)) if c.fetchone(): # 构造UPDATE语句:注意带空格的字段要用双引号包裹 update_sql = """ UPDATE disk SET "Mount Point" = ?, fstyle = ?, opts = ?, total = ?, used = ?, free = ?, usage = ? WHERE client_ip = ? AND Device = ? """ # 整理批量更新的参数:每条磁盘记录对应一组参数 update_params = [] for disk_item in DISK.values(): # disk_item的顺序:Device, Mount Point, fstyle, opts, total, used, free, usage # 对应UPDATE的参数顺序:Mount Point, fstyle, opts, total, used, free, usage, 客户端IP, Device params = ( disk_item[1], disk_item[2], disk_item[3], disk_item[4], disk_item[5], disk_item[6], disk_item[7], target_ip, disk_item[0] ) update_params.append(params) # 批量执行更新,比循环调用execute更高效 c.executemany(update_sql, update_params) conn.commit() print(f"成功更新了{c.rowcount}条磁盘记录") else: print(f"未找到IP为{target_ip}的客户端") except sqlite3.Error as e: print(f"数据库操作出错:{e}") conn.rollback() # 出错时回滚,避免数据不一致 finally: conn.close() # 无论成功失败,都要关闭连接
核心要点解释
- 带空格字段的处理:SQLite中字段名包含空格时,必须用双引号
"包裹(不能用单引号,单引号是用来包裹字符串值的),比如"Mount Point"。 - 精准定位更新记录:
WHERE条件必须同时指定client_ip(关联目标客户端)和Device(区分不同磁盘),这样才不会误更新其他客户端或其他磁盘的数据。 - 批量操作优化:用
executemany()代替循环调用execute(),减少数据库交互次数,提升效率,尤其是数据量较大时效果更明显。 - 事务与异常处理:通过
try-except-rollback确保数据库操作出错时回滚,避免出现数据不一致的情况。 - 高效判断客户端存在:用
fetchone()代替len(fetchall())>0,因为fetchall()会加载所有查询结果到内存,而fetchone()只取第一条记录,性能更优。
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

