SQLite3 Python27查询在Windows

时间:2015-12-03 18:13:13

标签: windows python-2.7 sqlite

一点背景知识。这是一个旨在缩小大型数据集(3 + GB文件)的脚本。我所拥有的是一系列SQL查询,用于创建用于从其他表插入/删除的临时表。

以下是前几个查询的内容:

查询#1

create table clash as
select *
from
    StallConnected
group by Store, Stall, StartTime
having
    count(*) > 1;

查询#2

create table OverlappingStarts as
select A.*
from
    StallConnected as A
    join
    clash as B
    on
        A.Store = B.Store
        and
        A.Stall = B.Stall
        and
        A.StartTime = B.StartTime
    order by
        A.Store, A.Stall, A.StartTime;

现在谈谈问题的关键。我正在线程上使用python的sqlite3模块中的数据库连接按顺序执行这些查询。这是代码:

for i, val in enumerate(queries):
  print "Step " + str(i + 1) + " of " + steps
  db.executescript(val)
db.commit()

我知道executescript()会在每个语句执行之前导致COMMIT发生,但会发生的是它会执行第一个查询就好了,但第二个查询只会挂起。没有例外,没有。

我知道它可能不会发生超时,因为它在单个线程上运行。它也没有抛出异常(很明显,它只是挂起)。我知道它会挂起,因为db-journal文件只有2KB。

我尝试了什么:

  • 在每个陈述后提交
  • 关闭/重新开启连接
  • 使用execute()而不是executescript()
  • 使用游标对象直接在数据库连接上调用execute()

有什么想法?我做了什么本来就错了吗? Windows文件锁定问题,我不知道?

编辑1:在运行过去一小时的脚本后,我发现实际上已经填充了一些表。这是什么交易?在DB Browser中运行我的整个sql脚本只需要大约30秒,而在python中需要花费1小时来填充表的一部分?

旁注:

>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.6.21'
>>>

1 个答案:

答案 0 :(得分:0)

神秘解决了!很明显,我的sqlite.dll库已经过时了,无法有效地执行连接(有些东西没有立即跳出来)。

@CL感谢您的提醒!