这是我的第一个python和sqlte的文章,虽然短小,但相信对遇到的会很有用。
当你需要向SQLITE数据库插入上百万条数据时,你会怎么做?
1.最简单粗暴的办法
for i in range(0,len(s_list)):
db.execute("insert into txt(txt) values (?)",(i,))
这样效率奇低,你会怎么做?
2.用SELECT UNION ALL,如下
sql="insert into txt "
for i in range(0,len(s_list)):
sql+="select '%s' union all " % s_list[i].replace("'","''")
if ((i % 499)==0) or (i==(len(s_list)-1)):
sql=sql[0:-10]
db.execute(sql)
sql="insert into txt "
细心的朋友注意了,这里有个499的数字,这是受SQlite 的一个参数限制SQLITE_LIMIT_COMPOUND_SELECT=500限制,怎么改?
3.终极大法,用INSERT INSERT VALUES(expr-list-1),…,(expr-list-N)
我翻遍中英文SQLite文档,终于找到这么一个语句,INSERT INSERT VALUES(expr-list-1),…,(expr-list-N),My God!,真香。
sql="insert into txt values ('"+"'),('".join(s_list)+"')"
db.execute(sql)
就这么简单和美好。
当然,实际应用中,您还会遇到引号的处理,数据库的各种限制,不过相信我为您提供了一个简单的思路。
可能有朋友会问,为什么不用excutemany呢,那有个BUG,我还没解决。