Question: Pourquoi ne puis-je pas ouvrir la base de données?
Info: Je travaille sur un projet dont le but n'est pas important mais utilise une base de données sqlite3. J'ai créé un programme de test qui s'exécute et lui transmet l'emplacement pour créer une base de données:
/tmp/cer/could.db
et le programme de test unitaire peut rendre la base de données sans problème. Je vais ensuite utiliser le programme, en passant au même endroit, et il dit
OperationalError: impossible d'ouvrir le fichier de base de données
J'ai essayé de le faire avec une base de données vide. avec la base de données, le test unitaire est resté, et sans base de données. dans les trois cas, j'obtiens cette erreur. La partie la plus frustrante doit être le fait que le test unitaire peut le faire parfaitement, mais le programme lui-même ne le peut pas.
Des indices sur ce qui se passe?
Diagnostic principal: SQLite est incapable d'ouvrir ce fichier pour une raison quelconque.
Vérification des raisons évidentes pour lesquelles et dans l'ordre approximatif que je recommande de vérifier:
/tmp
est-il plein? (Vous êtes sous Unix, utilisez donc df /tmp
pour le savoir.)/tmp/cer
a-t-il des autorisations «impaires»? (SQLite doit pouvoir créer des fichiers supplémentaires pour pouvoir gérer des tâches telles que le journal de validation.)/tmp
soit pratiquement toujours sur le bon type de FS, donc ce n'est probablement pas le cas - mais ce n'est toujours pas recommandé.)Si vous n'êtes pas sur le même ordinateur, il est fort possible que le système de production ne dispose pas d'un répertoire /tmp/cer
. Évident de résoudre ce problème en premier. De même, si vous êtes sur le même ordinateur mais que vous utilisez différents utilisateurs, vous risquez d'avoir des problèmes d'autorisations/de propriété. L'espace disque est un autre piège sérieux, mais moins probable. Je ne pense pas que ce soient les trois derniers, mais ils valent la peine de vérifier si les problèmes de déploiement les plus évidents sont réglés. Si ce n’est rien de ce qui précède, vous rencontrez un problème exotique et vous devrez fournir beaucoup plus d’informations (il pourrait même s'agir d'un bogue dans SQLite, mais connaissant les développeurs, il est peu probable).
Cela a fonctionné pour moi:
conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")
Remarque: Double barre oblique dans le chemin complet
Utilisation de python v2.7 sur Win 7 enterprise et Win Xp Pro
J'espère que ça aide quelqu'un.
Sur unix, j'ai eu cette erreur en utilisant le raccourci ~
pour le répertoire utilisateur . Le changer en /home/user
a résolu l'erreur.
Une des raisons peut être d’exécuter le code dans un chemin qui ne correspond pas au chemin spécifié pour la base de données. Par exemple si dans votre code vous avez:
conn = lite.connect('folder_A/my_database.db')
Et vous exécutez le code à l'intérieur du folder_A
ou d'autres endroits qui n'ont pas de folder_A
, cela provoquera une telle erreur. La raison en est que SQLite créera le fichier de base de données s'il n'existe pas, pas le dossier.
Un autre moyen de contourner ce problème pourrait être d'encapsuler votre commande de connexion dans une expression try-except
et de créer le répertoire s'il génère sqlite3.OperationalError
.
depuis os import mkdir import sqlite3 en tant que 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')
J'ai rencontré le même problème sous Windows 7. Mon nom de base de données était test
et j'ai l'erreur:
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
J'ai remplacé test
par test.db
et tout s'est bien passé.
Assurez-vous de ne pas éditer le fichier settings.py en essayant d’exécuter syncdb, vous obtiendrez la même erreur !!!
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)
pour un chemin complet plus clair si vous ne l'obtenez pas clairement
Utilisez le nom entièrement classifié du fichier de base de données
Use-home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite
au lieu-
Dans mon cas, la solution consistait à utiliser un chemin absolu, pour trouver un fichier existant:
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)
Je ne sais pas pourquoi ce correctif fonctionne: le chemin ne contenait que des caractères ASCII et aucun espace. Cela a quand même fait la différence.
Pour référence: Windows 7, Python 3.6.5 (64 bits).
Je ne pouvais pas reproduire le problème sur un autre ordinateur (également Windows 7, Python 3.6.4 64 bits), donc je ne sais pas du tout pourquoi ce correctif fonctionne.
C'est définitivement un problème d'autorisations. Si quelqu'un reçoit cette erreur sur linux, assurez-vous que vous exécutez la commande avec Sudo
car le fichier appartient probablement à root. J'espère que cela pourra aider!
La seule chose à faire est de créer le dossier (car il n’existe pas déjà), seul le fichier de base de données sera créé par le programme .Cela a vraiment fonctionné pour moi!