我偶尔得到这个错误:sqlite3.OperationalError:无法打开数据库文件
这发生在python 2.6.6,sqlite3。 我有一个使用sqlite的db类。以下是它的init的一部分。我偶尔得到这个错误:sqlite3.OperationalError:无法打开数据库文件
def _init_db(self):
"init the database tables and indices"
print '\n'.join(DROP_TABLES[0:1])
print '\n'.join(CREATE_TABLES[0:1])
print '\n'.join(CREATE_INDEXES[0:1])
print '\n'.join(CREATE_TRIGGERS[0:1])
for query in DROP_TABLES:
self.connection.execute(query)
# self.connection.commit()
for query in CREATE_TABLES:
self.connection.execute(query)
# self.connection.commit()
for query in CREATE_INDEXES:
self.connection.execute(query)
# self.connection.commit()
for query in CREATE_TRIGGERS:
self.connection.execute(query)
self.connection.commit()
这里是打印输出的查询。 (它不是在我看来非常重要的,是为了完整性)
DROP TABLE IF EXISTS graph_T
CREATE TABLE IF NOT EXISTS graph_T
(v1 int,
v2 int,
step_start int,
step_end int DEFAULT 2147483647,
value int DEFAULT 1,
path_kind int DEFAULT 0,
path_id long,
partial_path_id long)
CREATE INDEX IF NOT EXISTS idxgraph_T
ON graph_T(v1,v2)
CREATE TRIGGER IF NOT EXISTS trig_graph_T_path_id
AFTER INSERT ON graph_T
BEGIN
UPDATE graph_T SET
path_id = (10000 * 10000 * max(new.v1, new.v2) +
10000 * min(new.v1, new.v2) + 0) ,
partial_path_id = 10000 * 10000 * max(new.v1, new.v2) +
10000 * min(new.v1, new.v2)
WHERE rowid = new.rowid;
END;
我得到sqlite3.OperationalError:无法打开的self.connection.execute线的一个数据库文件。有时是第三或第四(它也发生在我的程序中的其他地方)。
我在windows上工作。我不知道为什么会发生这种情况,我做错了什么。 希望有任何建议。
更多信息(由于提问的问题): - 我没有使用并发访问。没有线程或任何类型的东西。
edit-更多信息:我在所有connection.execute行上添加了定时重试,它通常会失败一次或两次,然后工作。我猜测,执行命令返回时,可能数据不是实际上是写入磁盘。
SQLite并发访问不好。如果您有多个线程或进程访问相同的数据库文件,您将遇到此问题。
我没有在这里使用并发。 (我更新了问题) –
我的直觉告诉我,那里一定是一些可疑的文件系统中的事情,而不是软件。这些也许有:
- 将备份脚本移动/重命名文件或父文件夹临时
- 出现在文件系统的“本地”,但确实是一个SAN,并有一个与它
- 一些间歇性问题其他面向文件系统的内核模块,如透明加密,与SQLite的干扰系统调用
- 入侵检测软件与SQLite的干扰系统调用
- 其他用户打开进行读取文件不知情的情况下
- 它是病毒
:-)
我不确定这些选项中的任何一个很有可能,但也许我错了。你知道这些东西是否适合简单的家庭Windows 7?这将是很好,如果sqlite可以有一些重试机制内置或什么的。无论如何,感谢您的评论 –
网络驱动器? – wberry
没有。不错的猜测虽然... –