使用`executemany`更新现有SQLite3数据库中的条目(使用Python sq
发布时间:2020-12-12 18:58:57 所属栏目:百科 来源:网络整理
导读:我知道executemany可以用来方便地将新条目添加到数据库中;与for循环中的单个执行相比,减少 Python方法调用开销很有用.但是,我想知道这是否适用于SQLite的UPDATE. 更具体地说,请考虑以下设置: cnx = sqlite3.connect(DATABASE)c = cnx.cursor()for path in p
我知道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() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |