这发生在 python 2.6.6、sqlite3 上。我有一个使用 sqlite 的数据库类。下面是它的初始化部分。
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 行之一上打开数据库文件。有时是第三个或第四个(它也发生在我程序的其他地方)。
我在窗户上工作。我不确定为什么会发生这种情况以及我做错了什么。将不胜感激任何建议。
更多信息(由于提出的问题): - 我没有使用并发访问。没有线程或类似的东西。
编辑-更多信息:我在所有 connection.execute 行上添加了定时重试,它通常会失败一次或两次,然后就可以工作了。我猜测当执行命令返回时,数据可能并没有真正写入磁盘。