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?

2voto

Alopex Points 323

Suis tombé sur ce problème en essayant de créer un index dans une base de données parfaitement valide. Il s'avère qu'il lancera cette erreur (en plus d'autres raisons décrites ici) si la variable/répertoire sqlite temp_store_directory est inscriptible.

Solution: changer temp_store_directory avec c.execute(f'PRAGMA temp_store_directory = "{writable_directory}"'). Notez que cette pragma est en voie d'obsolescence et je ne suis pas encore sûr de ce que sera le remplacement.

1voto

Fallen Points 2162

J'ai rencontré le même problème sous Windows 7. Le nom de ma base de données était test et j'ai obtenu l'erreur :

self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: impossible d'ouvrir le fichier de base de données

J'ai remplacé test par test.db et tout s'est bien passé.

1voto

Shreya Bisen Points 11

La seule chose que vous devez faire est de créer le dossier (s'il n'existe pas déjà), seul le fichier de base de données sera créé par le programme. Cela a vraiment bien fonctionné pour moi !

1voto

pj.dewitte Points 306

Dans mon cas, la solution a été d'utiliser un chemin absolu pour trouver un fichier existant :

import os.path
filepath = os.path.abspath(filepath)
# Laissez ce passage s'il n'y a pas encore de fichier
assert os.path.exists(filepath), "Le fichier n'existe pas"
conn = sqlite3.connect(filepath)

Je ne sais pas pourquoi cette solution fonctionne : le chemin ne contenait que des caractères ASCII et pas d'espaces. Pourtant, cela a fait la différence.

Pour information : Windows 7, Python 3.6.5 (64 bits).

Je n'ai pas pu reproduire le problème sur une autre machine (également Windows 7, Python 3.6.4 64 bits), donc je ne sais pas pourquoi cette solution fonctionne.

1voto

Leiradk Points 11
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 ce n'est pas clair

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