103 votes

Sqlite3, OperationalError: impossible d'ouvrir le fichier de base de données

Question: Pourquoi je ne peux pas ouvrir la base de données?


Info: Je travaille sur un projet utilisant la base de données sqlite3. J'ai écrit un programme de test qui s'exécute et lui passe la base de données :

/tmp/cer/could.db

Le programme de test unitaire peut créer la db sans aucun problème. Mais, lorsque j'utilise réellement le programme en lui passant le même emplacement, j'ai obtenu l'erreur suivante:

OperationalError: impossible d'ouvrir le fichier de base de données

J'ai essayé de le faire avec:

1) une base de données vide.
2) la base de données et le test unitaire laissés derrière.
3) aucune base de données du tout.

Dans les trois cas, j'ai obtenu l'erreur ci-dessus. La partie la plus frustrante est que l' unittest peut le faire très bien, mais le programme réel ne peut pas.

Des idées sur ce qui se passe sur terre?

102voto

Donal Fellows Points 56559

Diagnostic principal : SQLite n'arrive pas à ouvrir ce fichier pour une raison quelconque.

Vérification des raisons évidentes pourquoi, et dans l'ordre approximatif que je recommande de vérifier :

  • Le programme s'exécute-t-il sur la même machine que celle sur laquelle vous le testez ?
  • Est-il en cours d'exécution en tant que vous (ou du moins le même utilisateur que celui avec lequel vous le testez) ?
  • Le disque contenant /tmp est-il plein ? (Vous êtes sur Unix, utilisez df /tmp pour le savoir.)
  • Le répertoire /tmp/cer a-t-il des permissions "étranges" ? (SQLite doit être capable de créer des fichiers supplémentaires dedans pour gérer des choses comme le journal de validation.)
  • Le code de test unitaire utilise-t-il toujours cette base de données ? (Des ouvertures concurrentes sont possibles avec un SQLite suffisamment moderne et sur le bon système de fichiers — bien que /tmp soit pratiquement toujours sur le bon type de FS donc ce n'est probablement pas ça — mais ce n'est toujours pas recommandé.)
  • Le code de développement essaie-t-il vraiment d'écrire dans cette base de données, ou est-ce quelque chose de "malin" qui vous piège et vous force à essayer d'ouvrir quelque chose d'autre ? (J'ai déjà été piégé par cela dans mon code par le passé ; ne pensez pas que cela ne peut pas vous arriver…)
  • Utilisez-vous la même version de la bibliothèque SQLite dans les tests unitaires et le code de production ?

Si vous n'êtes pas sur la même machine, il est tout à fait possible que le système de production n'ait pas de répertoire /tmp/cer. Évident de corriger cela en premier. De même, si vous êtes sur la même machine mais en tant qu'utilisateurs différents, vous êtes susceptible d'avoir des problèmes de permissions/propriété. L'espace disque est un autre problème sérieux, mais moins probable. Je ne pense pas que ce soit les trois derniers, mais ils valent la peine d'être vérifiés si les problèmes de déploiement plus évidents sont résolus. Si ce n'est aucun des cas ci-dessus, vous avez rencontré un problème exotique et devrez signaler beaucoup plus d'informations (cela pourrait même être un bug dans SQLite, mais connaissant les développeurs, je pense que c'est assez peu probable).

46voto

jhc Points 81

Cela a fonctionné pour moi:

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

Note: Doubler les slashes dans le chemin complet

Utilisation de Python v2.7 sur Win 7 Enterprise et Win XP Pro

J'espère que cela aidera quelqu'un.

16voto

Jacquot Points 1044

Sous Unix, j'ai obtenu cette erreur en utilisant le raccourci ~ pour le répertoire de l'utilisateur. Le fait de le changer en /home/utilisateur a résolu l'erreur.

9voto

Kasramvd Points 32864

Une raison pourrait être d'exécuter le code dans un chemin qui ne correspond pas à votre chemin spécifié pour la base de données. Par exemple, si dans votre code vous avez :

conn = lite.connect('dossier_A/ma_base_de_données.db')

Et si vous exécutez le code à l'intérieur du dossier_A ou d'autres endroits qui n'ont pas de dossier_A, cela soulèvera 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.

Une autre façon de contourner ce problème pourrait consister à envelopper votre commande de connexion dans une expression try-except et à créer le répertoire s'il soulève sqlite3.OperationalError.

à partir de os import mkdir import sqlite3 en tant que lite

try:
    conn = lite.connect('dossier_A/ma_base_de_données.db')
except lite.OperationalError:
    mkdir('dossier_A')
finally:
    conn = lite.connect('dossier_A/ma_base_de_données.db')

9voto

Ricky Points 336

Dans mon cas, j'ai essayé de créer la base de données sqlite dans le dossier /tmp et j'ai oublié une seule barre oblique parmi toutes les barres obliques

Au lieu de sqlite:///tmp/mydb.sqlite -> sqlite:////tmp/mydb.sqlite ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X