首页 > 解决方案 > Python - 来自 csv 文件的 SQLITE db 更新条目

问题描述

我正在尝试使用 csv 文件中的行更新现有的 sqlite db 行。不是删除和插入,而是更新现有行(保留 id)。

dqlite db 有 4 列,只有第 4 列不同(要更新)。如果不能只更新一列,我可以接受更新整行但保留其在 db 中的位置。

更新前的数据库:

cfthostname,cftshortname,cftenv,cert_time
1904h.net,1904h,tst,DD/MM/RRRR
19053.net,19053,tst,26/03/2021
2210010315.net,2210010315,prd,DD/MM/RRRR
1809m.net,1809m,tst,26/03/2021
13jw.net,13jw,acc,DD/MM/RRRR

csv 更新:

cfthostname,cftshortname,cftenv,cert_time
1904h.net,1904h,tst,13/05/2023
19053.net,19053,tst,23/07/2023
13jw.net,13jw,acc,14/06/2029

更新代码

import sqlite3
import csv

conn = sqlite3.connect("C:\db.sqlite3")
cursor = conn.cursor() 
[...]
with open('C:\\csv\\update.csv','rt') as fin:
    dr = csv.DictReader(fin)
    to_db = [(i['hostname'], i['shortname'], i['env'], i['cert_time']) for i in dr]

cursor.executemany("UPDATE itpassed_host SET hostname = ?, shortname = ?, env = ?, cert_time = ?", to_db)
conn.commit()

conn.close()

也尝试在to_db上使用()但它在 db 上给出相同的输出

cursor.executemany("UPDATE itpassed_host SET hostname = ?, shortname = ?, env = ?, cert_time = ?", (to_db))

更新后的数据库:

cfthostname,cftshortname,cftenv,cert_time
13jw.net,13jw,acc,14/06/2029
13jw.net,13jw,acc,14/06/2029
13jw.net,13jw,acc,14/06/2029
13jw.net,13jw,acc,14/06/2029
13jw.net,13jw,acc,14/06/2029

如何仅更新csv 中的行以在 db 中正确更新?

标签: pythonsqlitecsvsql-update

解决方案


使用WHERE条件。

import sqlite3
import csv

conn = sqlite3.connect("db.sqlite3")
cursor = conn.cursor() 
with open('update.csv','rt') as fin:
    dr = csv.DictReader(fin)
    to_db = [(i['cert_time'], i['cfthostname'], i['cftshortname'], i['cftenv'],) for i in dr]

cursor.executemany("UPDATE itpassed_host SET cert_time = ? WHERE cfthostname = ? AND cftshortname = ? AND cftenv = ?", to_db)
conn.commit()

conn.close()

请注意顺序更改为to_db=


推荐阅读