我偶尔得到这个错误: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行上添加了定时重试,它通常会失败一次或两次,然后工作。我猜测,执行命令返回时,可能数据不是实际上是写入磁盘。

+2

网络驱动器? – wberry

+0

没有。不错的猜测虽然... –

SQLite并发访问不好。如果您有多个线程或进程访问相同的数据库文件,您将遇到此问题。

+0

我没有在这里使用并发。 (我更新了问题) –

我的直觉告诉我,那里一定是一些可疑的文件系统中的事情,而不是软件。这些也许有:

  • 将备份脚本移动/重命名文件或父文件夹临时
  • 出现在文件系统的“本地”,但确实是一个SAN,并有一个与它
  • 一些间歇性问题其他面向文件系统的内核模块,如透明加密,与SQLite的干扰系统调用
  • 入侵检测软件与SQLite的干扰系统调用
  • 其他用户打开进行读取文件不知情的情况下
  • 它是病毒:-)
+0

我不确定这些选项中的任何一个很有可能,但也许我错了。你知道这些东西是否适合简单的家庭Windows 7?这将是很好,如果sqlite可以有一些重试机制内置或什么的。无论如何,感谢您的评论 –