将插入组合到一个事务Python SQLite3中

时间:2011-02-20 04:52:48

标签: python transactions insert sqlite

我正在尝试使用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')

然而,它似乎没有什么区别。提高插入速度的方法将非常受欢迎。

4 个答案:

答案 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