2011-01-09 72 views
37

問題:爲什麼我不能打開數據庫?Sqlite3,OperationalError:無法打開數據庫文件


信息:我正在研究一個項目,其目的不重要,但使用sqlite3數據庫。我做了運行,並傳遞給它的位置,使數據庫的測試程序:

/tmp/cer/could.db

和單元測試程序可以使數據庫沒有問題。那我走了實際使用的程序,通過同一個位置給它,和它說

OperationalError: unable to open database file

我試着用一個空數據庫這樣做。數據庫的單元測試留下了,根本沒有數據庫。在所有三種情況下,我得到這個錯誤。最令人沮喪的部分是單元測試可以做得很好,但實際的程序不能。

任何線索到底是怎麼回事?

+0

這是完整的路徑嗎?你確定你沒有通過環境變量或`〜`或其他簡短形式傳遞路徑嗎? – chrisaycock 2011-01-09 00:31:42

+0

/tmp/cer /目錄是否存在? – thkala 2011-01-09 00:33:54

+0

@chrisaycook:是的。我不是。 @thkala:確實如此。 – Narcolapser 2011-01-09 01:53:10

回答

47

主診斷:由於某種原因,SQLite無法打開該文件。

檢查明顯的原因,並在大致順序,我建議檢查:

  • 是程序在同一臺機器上運行,你正在測試它?
  • 它是否以您(或至少是您測試它的同一用戶)身份運行?
  • 包含/tmp的磁盤已滿? (您使用的是Unix,因此請使用df /tmp查找。)
  • /tmp/cer目錄是否具有「奇數」權限? (SQLite需要能夠在其中創建額外的文件以處理提交日誌等事情)。
  • 單元測試代碼是否仍在使用該數據庫? (併發打開可能與一個現代足夠的SQLite和當在正確的文件系統 - 雖然/tmp實際上總是在正確的類型的FS,所以它可能不是 - 但它仍然不推薦。)
  • 是發展代碼真的試圖寫入該數據庫,或者是「聰明」的東西趕上你,並導致它嘗試打開別的東西? (過去我在代碼中已經發現了這一點;不要認爲它不會發生在你身上......)
  • 在單元測試和生產代碼中是否使用了相同版本的SQLite庫?

如果您不在同一臺機器上,生產系統很可能沒有/tmp/cer目錄。顯然首先解決這個問題。同樣,如果您位於同一臺計算機上,但以不同用戶身份運行,則可能會遇到權限/所有權問題。磁盤空間是另一個嚴重的問題,但不太可能。我不認爲這是最後三個,但是他們值得檢查是否更明顯的部署問題被排序。如果不是上述情況,那麼你遇到了一個奇怪的問題,將不得不報告更多的信息(它甚至可能是SQLite中的一個錯誤,但知道它的開發者,我相信這是不太可能的)。

1

確保你沒有在試圖運行syncdb時編輯settings.py文件,你會得到同樣的錯誤!

self.connection = Database.connect(**kwargs) 
sqlite3.OperationalError: unable to open database file 
21

這爲我工作:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db") 

注:雙斜槓的完整路徑

在Win 7的企業和Win XP專業版使用蟒蛇V2.7

希望這可以幫助某人。

1

我遇到在Windows 7同樣的問題,我的數據庫的名字是test,我得到了錯誤:

self.connection = Database.connect(**kwargs) 
sqlite3.OperationalError: unable to open database file 

test.db更換test和所有去平滑。

1

原因之一可能是在與指定的數據庫路徑不匹配的路徑中運行代碼。例如,如果在你的代碼中有:

conn = lite.connect('folder_A/my_database.db') 

並運行不具有folder_A會提出這樣的錯誤folder_A或其他地方中的代碼。原因是SQLite會創建數據庫文件,如果它不存在的話不是該文件夾。

解決此問題的另一種方法可能是將連接命令封裝在try-except表達式中,並在創建目錄時提示sqlite3.OperationalError

從OS進口的mkdir 進口的sqlite3爲精簡版

try: 
    conn = lite.connect('folder_A/my_database.db') 
except lite.OperationalError: 
    mkdir('folder_A') 
finally: 
    conn = lite.connect('folder_A/my_database.db') 
1

在UNIX上使用的~快捷的用戶目錄時,我得到這個錯誤。 更改爲/home/user解決了錯誤。

相關問題