it-swarm.com.de

Sqlite3, OperationalError: Datenbankdatei kann nicht geöffnet werden

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?

44
Narcolapser

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:

  • Läuft das Programm auf dem gleichen Rechner wie Sie es testen?
  • Läuft es als Sie (oder zumindest derselbe Benutzer wie Sie es testen)?
  • Ist der Datenträger mit /tmp voll? (Sie sind auf Unix, verwenden Sie df /tmp, um das herauszufinden.)
  • Hat das /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.)
  • Verwendet der Gerätetestcode diese Datenbank noch? (Gleichzeitige Eröffnungen sind mit einer ausreichend modernen SQLite möglich und wenn im richtigen Dateisystem - obwohl /tmp praktisch immer auf der richtigen Art von FS ist, ist es wahrscheinlich nicht das - aber es wird trotzdem nicht empfohlen.
  • Versucht der Entwicklungscode wirklich , in diese Datenbank zu schreiben, oder ist es etwas "Kluges", das Sie herausfindet und veranlasst, etwas anderes zu öffnen? (Ich bin in der Vergangenheit in meinem Code davon erwischt worden; ich glaube nicht, dass es Ihnen nicht passieren kann ...)
  • Verwenden Sie in den Unit-Tests und im Produktionscode dieselbe Version der SQLite-Bibliothek?

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).

53
Donal Fellows

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.

24
jhc

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.

5
Jacquot

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')
2
Kasrâmvd

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.

1
Fallen

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
1
Thayne Trevenen
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

0
Leiradk

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.

0
crazycoder65

Verwenden Sie den vollständig klassifizierten Namen der Datenbankdatei 

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

stattdessen-

0
ANKIT CHOPADE

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.

0
pj.dewitte

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!

0
tzndr

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!

0
Shreya Bisen

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,

0