web-dev-qa-db-fra.com

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

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?

44
Narcolapser

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:

  • Le programme est-il exécuté sur le même ordinateur que vous le testez?
  • Est-ce que ça fonctionne comme vous (ou au moins le même utilisateur que vous l'avez testé)?
  • Le disque contenant /tmp est-il plein? (Vous êtes sous Unix, utilisez donc df /tmp pour le savoir.)
  • Le répertoire /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.)
  • Le code de test unitaire utilise-t-il toujours cette base de données? (Ouverture simultanée are possible avec un SQLite assez moderne et avec le bon système de fichiers - bien que /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é.)
  • Est-ce que le code de développement vraiment essaie d'écrire dans cette base de données, ou est-ce que quelque chose d '«intelligent» vous prend au piège et l'amène à essayer d'ouvrir autre chose? (J'ai déjà été surpris par cela dans mon code; ne pensez pas que cela ne puisse 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 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).

53
Donal Fellows

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.

24
jhc

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.

5
Jacquot

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

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

1
Fallen

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


pour un chemin complet plus clair si vous ne l'obtenez pas clairement

0
Leiradk

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-

0
ANKIT CHOPADE

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.

0
pj.dewitte

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!

0
tzndr

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!

0
Shreya Bisen