簡體   English   中英

Sqlite3,OperationalError:無法打開數據庫文件

[英]Sqlite3, OperationalError: unable to open database file

問題:為什么我無法打開數據庫?


信息:我正在使用sqlite3數據庫進行項目。 我編寫了一個運行並將其傳遞給數據庫的測試程序:

/tmp/cer/could.db

單元測試程序可以使db沒有任何問題。 但是,當我實際使用將相同位置傳遞給它的程序時,出現以下錯誤:

OperationalError:無法打開數據庫文件

我試過這樣做:

1) an empty database.
2) the database and the unit test left behind.
3) no database at all.

在三種情況下,我得到了上述錯誤。 最令人沮喪的部分是unittest可以做到這一點,但實際程序卻做不到。

關於地球上發生了什么的任何線索?

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

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

  • 該程序是否與您正在測試它在同一台機器上運行?
  • 它是否像您一樣運行(或至少與您測試它的用戶相同)?
  • 包含/tmp的磁盤是否已滿? (您使用的是 Unix,因此請使用df /tmp來查找。)
  • /tmp/cer目錄是否有“奇數”權限? (SQLite 需要能夠在其中創建其他文件才能處理諸如提交日志之類的事情。)
  • 單元測試代碼是否仍在使用該數據庫? (使用足夠現代的 SQLite 並且在正確的文件系統中時,並發打開可能的 - 盡管/tmp實際上總是在正確的 FS 上,所以它可能不是這樣 - 但仍然不推薦。)
  • 開發代碼是否真的試圖寫入該數據庫,或者是“聰明”的東西抓住了你並導致它試圖打開其他東西? (我過去在我的代碼中被這個問題所困擾;不要認為它不會發生在你身上……)
  • 您是否在單元測試和生產代碼中使用相同版本的 SQLite 庫?

如果您不在同一台機器上,則生產系統很可能沒有/tmp/cer目錄。 顯然要先解決這個問題。 同樣,如果您在同一台機器上但以不同的用戶身份運行,您可能會遇到權限/所有權問題。 磁盤空間是另一個嚴重的問題,但可能性較小。 我不認為這是最后三個,但如果對更明顯的部署問題進行了排序,它們值得檢查。 如果以上都不是,那么您遇到了一個奇怪的問題並且將不得不報告更多信息(它甚至可能是 SQLite 中的一個錯誤,但了解它的開發人員,我認為這不太可能)。

這對我有用:

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

注意:完整路徑中的雙斜杠

在 Win 7 企業版和 Win Xp Pro 上使用python v2.7

希望這可以幫助某人。

在 unix 上,使用用戶目錄的~快捷方式時出現該錯誤。 將其更改為/home/user解決了該錯誤。

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

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

並且您在folder_A或其他沒有folder_A的地方運行代碼會引發此類錯誤。 原因是如果數據庫文件不存在而不是文件夾,SQLite 將創建數據庫文件。

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

從 os 導入 mkdir 導入 sqlite3 作為 lite

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

就我而言,我嘗試在/tmp文件夾中創建 sqlite db,並且從所有斜杠中我錯過了一個斜杠

而不是sqlite:///tmp/mydb.sqlite -> sqlite:////tmp/mydb.sqlite ...

嘗試在完全有效的數據庫上創建索引時遇到此問題。 事實證明,如果 sqlite temp_store_directory變量/目錄不可寫,它將引發此錯誤(除了此處描述的其他原因)。

解決方案:用c.execute(f'PRAGMA temp_store_directory = "{writable_directory}"')更改temp_store_directory 請注意,此編譯指示 已被棄用,我還不確定替換將是什么。

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

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

我用test.db替換了test ,一切都很順利。

就我而言,解決方案是使用絕對路徑來查找現有文件:

import os.path
filepath = os.path.abspath(filepath)
# Leave this out if the file doesn't exist yet
assert os.path.exists(filepath), "The file doesn't exist"
conn = sqlite3.connect(filepath)

我不知道為什么這個修復有效:路徑只包含 ASCII 字符,沒有空格。 盡管如此,它還是有所作為。

供參考:Windows 7、Python 3.6.5(64 位)。

我無法在另一台機器(也是 Windows 7、Python 3.6.4 64 位)上重現該問題,所以我不知道為什么此修復程序有效。

import sqlite3

connection = sqlite3.connect("d:\\pythonAPI\\data.db")
cursor = connection.cursor()
create_table = "CREATE TABLE users (id int, username text, password text)"
cursor.execute(create_table)


如果您沒有弄清楚,可以獲得更清晰的完整路徑

使用數據庫文件的完全分類名稱

使用-/home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite

反而-

如果在能夠正確訪問您的數據庫后隨機發生這種情況(並且沒有更改任何設置),則可能是由於數據庫損壞

嘗試同時從兩個進程寫入我的數據庫后出現此錯誤,它一定損壞了我的 db.sqlite3 文件。

我的解決方案是在損壞發生之前恢復到以前的提交。

在 Windows 上遇到錯誤,添加了 assert os.path.exists,仔細檢查了路徑,以管理員身份運行腳本,沒有任何幫助。

事實證明,如果您將文件夾添加到 Windows Defender 的勒索軟件保護中,除非您將這些程序添加到受控文件夾訪問的白名單中,否則您將無法再使用其他程序在那里寫入。

解決方案 - 檢查您的文件夾是否已添加到 Windows Defender 的勒索軟件保護中並將其刪除以便更快地修復。

您唯一需要做的就是創建文件夾(因為它不存在),程序只會創建數據庫文件。 這真的對我有用!

這絕對是權限問題。 如果有人在 linux 上遇到此錯誤,請確保您使用sudo運行該命令,因為該文件很可能歸 root 所有。 希望有幫助!

1)驗證你的數據庫路徑,檢查你的settings.py

DATABASES = {
    'default': {
        'CONN_MAX_AGE': 0,
        'ENGINE': 'django.db.backends.sqlite3',
        'HOST': 'localhost',
        'NAME': os.path.join(BASE_DIR, 'project.db'),
        'PASSWORD': '',
        'PORT': '',
        'USER':''

有時不會有 NAME': os.path.join(BASE_DIR, 'project.db'),

2)確保目標文件夾的權限和所有權

它對我有用,

我的理由很愚蠢。 我已將 manage.py 放到終端上,因此它使用完整路徑運行。 我已經更改了項目文件夾的名稱。 所以現在,程序無法找到包含先前數據的文件,因此出現錯誤。

確保在這種情況下重新啟動軟件。

對於與此問題相關的氣流問題的任何人。

就我而言,我已經在/root/airflow並將其調度程序作為root運行。 我在運行任務實例時使用了run_as_user參數來模擬Web用戶。 但是,氣流始終無法觸發我的 DAG,並在日志中出現以下錯誤:

sqlite3.OperationalError: unable to open database file
...
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file

我還發現,一旦我手動觸發了 DAG,就會在/home/web下自動創建一個新的氣流資源目錄。 我不清楚這種行為,但我通過從/root刪除整個氣流資源,重新初始化/home/web下的氣流數據庫並將調度程序作為web運行來使其工作:

[root@host ~]# rm -rf airflow
[web@host ~]$ airflow initdb
[web@host ~]$ airflow scheduler -D

如果你想嘗試這種方法,我可能需要在做任何事情之前備份你的數據。

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

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

有同樣的問題,但最佳答案對我來說太長了,所以我建議打開另一個 shell 窗口類型cd #enter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM