Frage: Warum kann ich die Datenbank nicht öffnen?
Info: Ich arbeite an einem Projekt, dessen Zweck nicht wichtig ist, aber eine sqlite3-Datenbank verwendet. Ich habe ein Testprogramm erstellt, das den Speicherort zur Erstellung einer Datenbank ausführt:
/tmp/cer/could.db
und das Unit-Test-Programm kann die DB kein Problem machen. Ich gehe dann tatsächlich mit dem Programm und übergebe den gleichen Ort und es sagt
OperationalError: Datenbankdatei kann nicht geöffnet werden
Ich habe es mit einer leeren Datenbank versucht. mit der Datenbank bleibt der Unit-Test zurück und ohne Datenbank. In allen drei Fällen erhalte ich diesen Fehler. Der frustrierendste Teil muss die Tatsache sein, dass der Komponententest dies gut kann, das eigentliche Programm jedoch nicht.
Gibt es Hinweise, was in aller Welt los ist?
Primäre Diagnose: SQLite kann die Datei aus irgendeinem Grund nicht öffnen.
Überprüfen Sie die offensichtlichen Gründe dafür und in ungefährer Reihenfolge empfehle ich Folgendes:
/tmp
voll? (Sie sind auf Unix, verwenden Sie df /tmp
, um das herauszufinden.)/tmp/cer
-Verzeichnis "ungerade" Berechtigungen? (SQLite muss in der Lage sein, zusätzliche Dateien zu erstellen, um z. B. das Commit-Protokoll verarbeiten zu können.)/tmp
praktisch immer auf der richtigen Art von FS ist, ist es wahrscheinlich nicht das - aber es wird trotzdem nicht empfohlen.Wenn Sie sich nicht auf demselben Computer befinden, kann es sein, dass das Produktionssystem kein /tmp/cer
-Verzeichnis hat. Offensichtlich, das zuerst zu beheben. Wenn Sie sich auf demselben Computer befinden und unterschiedliche Benutzer verwenden, haben Sie wahrscheinlich Probleme mit der Berechtigung/dem Besitz. Der Festplattenspeicher ist eine andere ernste Angelegenheit, aber weniger wahrscheinlich. Ich denke nicht, dass es die letzten drei sind, aber es lohnt sich zu prüfen, ob die offensichtlichen Bereitstellungsprobleme gelöst werden. Wenn dies nicht der Fall ist, haben Sie ein exotisches Problem und müssen mehr Informationen melden (es könnte sogar ein Fehler in SQLite sein, aber wenn ich die Entwickler kenne, glaube ich, dass dies ziemlich unwahrscheinlich ist).
Das hat für mich funktioniert:
conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")
Hinweis: Doppelte Schrägstriche im vollständigen Pfad
Verwenden von python v2.7 unter Windows 7 Enterprise und Win XP Pro
Hoffe das hilft jemandem.
Bei Unix habe ich diesen Fehler erhalten, als ich die ~
-Verknüpfung für das Benutzerverzeichnis verwendet habe . Durch Ändern in /home/user
wurde der Fehler behoben.
Ein Grund könnte sein, den Code in einem Pfad auszuführen, der nicht mit dem angegebenen Pfad für die Datenbank übereinstimmt. Zum Beispiel, wenn Sie in Ihrem Code Folgendes haben:
conn = lite.connect('folder_A/my_database.db')
Und Sie führen den Code innerhalb von folder_A
oder an anderen Orten aus, die keinen folder_A
haben. Dies wird einen solchen Fehler auslösen. Der Grund ist, dass SQLite die Datenbankdatei erstellt, wenn sie nicht im Ordner vorhanden ist.
Eine andere Möglichkeit, dieses Problem zu umgehen, besteht darin, den Verbindungsbefehl in einen try-except
-Ausdruck zu packen und das Verzeichnis zu erstellen, wenn sqlite3.OperationalError
ausgelöst wird.
von os import mkdir importiere sqlite3 als 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')
Unter Windows 7 war ich mit dem gleichen Problem konfrontiert. Mein Datenbankname war test
und ich bekam den Fehler:
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
Ich ersetzte test
durch test.db
und alles lief reibungslos.
Stellen Sie sicher, dass Sie die Datei "settings.py" nicht bearbeiten, während Sie versuchen, syncdb auszuführen. Der gleiche Fehler wird angezeigt.
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
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)
für einen klareren vollständigen Pfad, wenn Sie ihn nicht klar gemacht haben
Wenn dies nach dem richtigen Zugriff auf Ihre Datenbank zufällig geschieht (und keine Einstellungen geändert wurden), kann dies an einer beschädigten Datenbank liegen.
Ich habe diese Fehlermeldung erhalten, nachdem versucht hat, von zwei Prozessen gleichzeitig in meine Datenbank zu schreiben und meine Datei db.sqlite3 beschädigt haben muss.
Meine Lösung war Zurücksetzen auf einen vorherigen Commit, bevor die Beschädigung auftrat.
Verwenden Sie den vollständig klassifizierten Namen der Datenbankdatei
Use- /home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite
stattdessen-
In meinem Fall bestand die Lösung darin, einen absoluten Pfad zu verwenden, um eine vorhandene Datei zu finden:
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)
Ich weiß nicht, warum dieses Update funktioniert: Der Pfad enthielt nur ASCII Zeichen und keine Leerzeichen. Trotzdem machte es den Unterschied.
Als Referenz: Windows 7, Python 3.6.5 (64-Bit).
Ich konnte das Problem nicht auf einem anderen Computer reproduzieren (auch Windows 7, Python 3.6.4 64-Bit), daher habe ich keine Ahnung, warum dieses Update funktioniert.
Dies ist definitiv ein Berechtigungsproblem. Wenn jemand unter Linux diesen Fehler erhält, stellen Sie sicher, dass Sie den Befehl mit Sudo
ausführen, da die Datei höchstwahrscheinlich im Besitz von root ist. Hoffentlich hilft das!
Das einzige, was Sie tun müssen, ist das Erstellen des Ordners (da es noch nicht existiert), nur die Datenbankdatei wird vom Programm erstellt .. Das hat wirklich für mich funktioniert!
1) Überprüfen Sie Ihren Datenbankpfad und checken Sie Ihre settings.py ein
DATABASES = {
'default': {
'CONN_MAX_AGE': 0,
'ENGINE': 'Django.db.backends.sqlite3',
'Host': 'localhost',
'NAME': os.path.join(BASE_DIR, 'project.db'),
'PASSWORD': '',
'PORT': '',
'USER':''
manchmal gibt es keinen NAME ': os.path.join (BASE_DIR,' project.db '),
2) Achten Sie auf die Berechtigung und den Besitz zum Zielordner
es hat bei mir funktioniert,