使用`executemany`更新现有SQLite3数据库中的条目(使用Python sqlite3)

我知道executemany可以用来方便地将新条目添加到数据库中;与for循环中的单个执行相比,减少 Python方法调用开销很有用.但是,我想知道这是否适用于SQLite的UPDATE.

更具体地说,请考虑以下设置:

cnx = sqlite3.connect(DATABASE)
c = cnx.cursor()
for path in paths:
    for data in some_computation(path):
        c.execute("UPDATE TABLENAME SET cont=? WHERE id=?",(data[1],data[0]))
cnx.commit()
cnx.close()

我甚至不确定下面的方法是否会更快(必须对它进行基准测试),但问题是它不起作用,因为我做错了我假设.有关在下面的代码片段中使用executemany来完成我上面发布的任务的提示吗?

cnx = sqlite3.connect(DATABASE)
c = cnx.cursor()

for path in paths:
    data_ids,data_conts = [],[]
    for data in some_computation(path):
        if len(data_ids) >= CHUNKSIZE:
            c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?",(data_conts,data_ids))
            cnx.commit()
            data_ids,[]
        data_ids.append(data[0])
        data_conts.append(data[1])
    c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?",data_ids))      
    cnx.commit()

cnx.commit()
cnx.close()

非常感谢您的提示和见解!

编辑1:

底部示例的问题:

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

(其中CHUNKSIZE = 50000)

编辑2:

发生同样的错误

cnx = sqlite3.connect(DATABASE)
c = cnx.cursor()

for path in paths:
    data_conts = []
    for data in some_computation(path):
        if len(data_ids) >= CHUNKSIZE:
            c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?",))
            cnx.commit()
            data_conts = []

        data_conts.append([data[1],data[0]])
    c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?",))   
    cnx.commit()

cnx.commit()
cnx.close()

但感谢@falsetru我注意到我的错误,应该是

... WHERE id=?",data_conts)

并不是

... WHERE id=?",))

解决方法

你需要传递一系列序列([[cont,id],[cont,…],而不是[cont,cont,[id,id,ID,..]):

for path in paths:
    params = []
    for data in some_computation(path):
        if len(data_ids) >= CHUNKSIZE:
            c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?",params)
            cnx.commit()
            params = []
        params.append([data[1],data[0]])
    if params:
        c.executemany("UPDATE TABLENAME SET cont=? WHERE id=?",params)
    cnx.commit()

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能