【问题标题】:Python - SQLite : Update two record with same identify valuePython - SQLite:更新两条具有相同标识值的记录
【发布时间】:2023-03-16 02:38:01
【问题描述】:

我有一个如下脚本:

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 命令后,在表 disk 中,我将有两条关于磁盘 C 和磁盘 D 的记录,其列 Client_IP (192.168.10.111) 的值相同。 更新后,IP“192.168.10.111”的两条记录在每一列上都得到相同的值,这是非常错误的。一条记录必须包含有关 C 盘的信息,而另一条记录必须包含 D 盘信息。

如何使 UPDATE 正常工作? dict DISK 的长度取决于计算机安装的设备数量。所以我需要使用for循环来更新而不是静态更新。

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

【问题讨论】:

  • 哪些列标识了您要更新的行?
  • 它是表 disk 中的 Client_IP。请注意,SELECT 是从 clientinfo 而不是 disk 的不同表中选择的。
  • 当您有多行具有相同的 Client_IP 值时,此列无法识别这些行。
  • 是的,你知道如何解决它吗?
  • 当你得到这两行时,你如何确定哪一行是正确的?您使用哪一列来识别具有正确磁盘的那一列?

标签: python python-2.7 sqlite


【解决方案1】:

根据您稍后的 UPDATEINSERT 查询,您的 SELECT 查询列值不正确。而不是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()])

【讨论】:

  • 嗨 Ajax1234,SELECT 是正确的,因为 clientinfo 是一个不同的表,它只有一列包含客户端 IP。 INSERT 和 UPDATE 用于表磁盘。但没关系,问题是我可以运行你的代码。 *i 存在语法错误。请注意,我使用 Python 2.7。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多