我有一个如下脚本:
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%']}
conn = sqlite3.connect("Test.db")
c = conn.cursor()
result = c.execute("SELECT * FROM clientinfo WHERE IP = ?", ("192.168.10.111",))
if (len(result.fetchall()) > 0):
for x in DISK :
c.execute("UPDATE disk SET Device = ?, 'Mount Point' = ?, 'fstyle' = ?, 'opts' = ?, 'total' = ?, 'used' = ?, 'free' = ?, 'percent' = ? WHERE Client_IP = ?", (DISK[x][0], DISK[x][1], DISK[x][2], DISK[x][3], DISK[x][4], DISK[x][5], DISK[x][6], DISK[x][7], "192.168.10.111"))
else :
for x in DISK :
c.execute("INSERT INTO disk('Client_IP', 'Device', 'Mount Point', 'fstyle', 'opts', 'total', 'used', 'free', 'percent') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", ("192.168.10.111", DISK[x][0], DISK[x][1], DISK[x][2], DISK[x][3], DISK[x][4], DISK[x][5], DISK[x][6], DISK[x][7]))
conn.commit()
conn.close()
如果有关于IP" 192.168.10.111"的任何记录,脚本将检入db。如果db已经有关于IP" 192.168.10.111"的记录,则脚本会将数据从dict DISK 更新到db的表磁盘。 如果db没有关于IP" 192.168.10.111"的记录,脚本将创建记录以插入** DISK""到数据库。
INSERT命令工作正常,但UPDATE命令不能像我想的那样工作。运行INSERT命令后,在表磁盘中,我将有两个关于磁盘C和磁盘D的记录,其列值 Client_IP (192.168.10.111)。 更新后,两个IP记录" 192.168.10.111"在每一列上得到相同的值,这是非常错误的。一条记录必须包含有关磁盘C的信息和另一条记录有关磁盘D信息的信息。
如何让UPDATE正常工作? dict的长度 DISK 取决于计算机安装的设备数量。所以我需要使用for循环到UPDATE而不是静态UPDATE。
请告诉我如何解决这个问题, 非常感谢, 弗朗西斯
答案 0 :(得分:1)
根据您之后的SELECT
和UPDATE
查询,您的INSERT
查询列值不正确。而不是IP
,不应该是CLIENT_IP
吗?此外,您需要更改字符串查询格式。从列名中删除单引号。不幸的是,您可以使用简单的列表推导和cursor.executemany
:
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%']}
conn = sqlite3.connect("Test.db")
c = conn.cursor()
if not list(c.execute('SELECT * FROM lientinfo WHERE CLIENT_IP = ?', ("192.168.10.111",))):
c.executemany("INSERT INTO disk (Client_IP, Device, Mount Point, fstyle, opts, total, used, free, percent) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", [["192.168.10.111", *i] for i in DISK.values()])
else:
c.executemany('UPDATE disk SET Device = ?, Mount Point = ?, fstyle = ?, opts = ?, total = ?, used = ?, free = ?, percent = ? WHERE Client_IP = ?', [[*i, "192.168.10.111"] for i in DISK.values()])