Python。我需要根据两个csv文件中的数据从sqlite3数据库中追加和删除行。至于追加它的全部罚款,我有删除的问题。

我有csv文件删除,如下所示:

hostname,shortname,env
lx1234.pl.net,lx1234,tst
sp2444445.net,sp2444445,prd

python看起来像这样:

import sqlite3
import csv

conn = sqlite3.connect("C:\db.sqlite3")
cursor = conn.cursor()
[...]

######---APPEND to DB---######
cursor.execute("CREATE TABLE IF NOT EXISTS itpassed_host (hostname, shortname, env);")
with open('C:\csv\insert.csv','rt') as fin:
    dr = csv.DictReader(fin)
    to_db = [(i['hostname'], i['shortname'], i['env']) for i in dr]

cursor.executemany("INSERT INTO itpassed_host (hostname, shortname, env) VALUES (?, ?, ?);", to_db)
conn.commit()

######---DELETE from DB---######
with open('C:\csv\decom.csv','rt') as fin:
    dr = csv.DictReader(fin)
    del_db = [i['shortname'] for i in dr]
    #print(del_db)

    cursor.executemany("DELETE FROM itpassed_host WHERE shortname = ?;", (del_db,))
    conn.commit()

conn.close()

print(del_db)给出输出:

['lx1234', 'sp2444445']

所以它的字典

它给了我错误:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.

如何根据for循环创建的字典删除那些行?

分析解答

当你传递一个list的元组时,你传递的是一个列表的元组。

with open('C:\csv\decom.csv','rt') as fin:
    dr = csv.DictReader(fin)
    del_db = [i['cftshortname'] for i in dr]
    #print(del_db)

    del_db = [(d,) for d in del_db]
    cursor.executemany("DELETE FROM itpassed_host WHERE shortname = ?;", del_db)
    conn.commit()