Python - SQLite: обновить две записи с одинаковым идентификатором - PullRequest
0 голосов
/ 06 мая 2018

У меня есть скрипт, как показано ниже:

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". Если в БД уже есть запись об IP «192.168.10.111», Script обновит данные из dict DISK на табличный диск БД. Если в базе данных нет записи об IP "192.168.10.111", Script создаст запись для вставки ** DISK "" в базу данных.

Команда INSERT работает хорошо, но команда UPDATE работает не так, как я хочу. После выполнения команды INSERT в таблице диск у меня будет две записи о диске C и диске D с одинаковым значением столбца Client_IP (192.168.10.111). После ОБНОВЛЕНИЯ две записи IP "192.168.10.111" получают одинаковое значение в каждом столбце, что очень неправильно. Одна запись должна содержать информацию о диске C, а другая запись - информацию о диске D.

Как я могу заставить ОБНОВЛЕНИЕ работать правильно? длина dict DISK зависит от того, сколько на компьютере установлено подключенных устройств. Поэтому мне нужно использовать цикл для ОБНОВЛЕНИЯ, но не статическое ОБНОВЛЕНИЕ.

Скажите, пожалуйста, как это исправить, Большое спасибо, Фрэнсис

1 Ответ

0 голосов
/ 06 мая 2018

Ваше значение столбца запроса 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()])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...