2012-05-13 52 views
2

這發生在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

沒有。不錯的猜測雖然... –

回答

2

SQLite併發訪問不好。如果您有多個線程或進程訪問相同的數據庫文件,您將遇到此問題。

+0

我沒有在這裏使用併發。 (我更新了問題) –

3

我的直覺告訴我,那裏一定是一些可疑的文件系統中的事情,而不是軟件。這些也許有:

  • 將備份腳本移動/重命名文件或父文件夾臨時
  • 出現在文件系統的「本地」,但確實是一個SAN,並有一個與它
  • 一些間歇性問題其他面向文件系統的內核模塊,如透明加密,與SQLite的干擾系統調用
  • 入侵檢測軟件與SQLite的干擾系統調用
  • 其他用戶打開進行讀取文件不知情的情況下
  • 它是病毒:-)
+0

我不確定這些選項中的任何一個很有可能,但也許我錯了。你知道這些東西是否適合簡單的家庭Windows 7?這將是很好,如果sqlite可以有一些重試機制內置或什麼的。無論如何,感謝您的評論 –

相關問題