Python - SQLite:使用相同的标识值

时间:2018-05-06 18:47:49

标签: python python-2.7 sqlite

我有一个如下脚本:

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。

请告诉我如何解决这个问题, 非常感谢, 弗朗西斯

1 个答案:

答案 0 :(得分:1)

根据您之后的SELECTUPDATE查询,您的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()])