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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:45:26