一点背景知识。这是一个旨在缩小大型数据集(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'
>>>
答案 0 :(得分:0)
神秘解决了!很明显,我的sqlite.dll
库已经过时了,无法有效地执行连接(有些东西没有立即跳出来)。
@CL感谢您的提醒!