我正在尝试使用insert在SQLite3上输入1000行,但插入时间太长。我知道如果将插入组合成一个事务,速度会大大提高。但是,我似乎无法让SQlite3跳过检查文件是否写在硬盘上。
这是一个示例:
if repeat != 'y':
c.execute('INSERT INTO Hand (number, word) VALUES (null, ?)', [wordin[wordnum]])
print wordin[wordnum]
data.commit()
这就是我在开始时所拥有的。
data = connect('databasenew')
data.isolation_level = None
c = data.cursor()
c.execute('begin')
然而,它似乎没有什么区别。提高插入速度的方法将非常受欢迎。
答案 0 :(得分:3)
根据Sqlite文档,BEGIN
交易应以COMMIT
可以使用BEGIN命令手动启动事务。这样 事务通常持续到下一个COMMIT或ROLLBACK 命令。但是如果数据库是事务,事务也将ROLLBACK 关闭或者如果发生错误并且ROLLBACK冲突解决 算法已指定。请参阅ON CONFLICT上的文档 有关ROLLBACK冲突的其他信息的子句 分辨率算法。
所以,你的代码应该是这样的:
data = connect('databasenew')
data.isolation_level = None
c = data.cursor()
c.execute('begin')
if repeat != 'y':
c.execute('INSERT INTO Hand (number, word) VALUES (null,?)', [wordin[wordnum]])
print wordin[wordnum]
data.commit()
c.execute('commit')
答案 1 :(得分:2)
https://stackoverflow.com/a/3689929/1147726回答了这个问题。 execute('begin')没有任何效果。显然,connection.commit()就足够了。
答案 2 :(得分:1)
(如果有人还在寻找答案)
如果您只是连续执行1000次插入,则应该使用executemany。
查看What is the optimized way to insert large number of records (more than 40,000) in sqlite3
我只是努力完成了大约30分钟完成的LOT(订购数百万)执行 - 切换到执行,我现在已经将其缩短到大约10分钟。
答案 3 :(得分:0)
您可以使用executemany,请参阅此问题:python sqlite question - Insert method