Comment vérifier si une base de données SQLite3 existe en Python?
Je suis en train de créer une fonction en Python 2.7.3 pour ouvrir une base de données SQLite.
C'est mon code pour le moment:
import sqlite3 as lite
import sys
db = r'someDb.sqlite'
def opendb(db):
try:
conn = lite.connect(db)
except sqlite3.Error:
print "Error open db.\n"
return False
cur = conn.cursor()
return [conn, cur]
J'ai essayé le code ci-dessus et j'ai observé que la sqlite3
bibliothèque ouvre la base de données déclarée si elle existe, ou crée une nouvelle base de données si celle-ci n'existe pas.
Est-il un moyen de vérifier si la base de données existe avec sqlite3
méthodes ou je dois utiliser un fichier comme os.path.isfile(path)
?
source d'informationauteur maxim
Vous devez vous connecter pour publier un commentaire.
En Python 2, vous devez explicitement tester l'existence à l'aide de
os.chemin d'accès.isfile
:Il n'y a aucun moyen de forcer l'
sqlite3.connect
fonction pour ne pas créer le fichier pour vous.Pour ceux qui sont à l'aide de Python 3.4 ou plus récent, vous pouvez utiliser le nouveau chemin de l'URI fonction pour définir un mode différent lors de l'ouverture d'une base de données. Le
sqlite3.connect()
fonction par défaut, les bases de données ouvertes dansrwc
c'est-à Lire, Écrire & Créer mode, de sorte que la connexion à un non-existant de la base de données va l'amener à être créé.À l'aide d'une URI, vous pouvez spécifier un mode différent à la place; si vous le réglez à
rw
donc Lire & Écrire mode, une exception est générée lorsque vous essayez de vous connecter à un non-existant de la base de données. Vous pouvez choisir entre différents modes lorsque vous définissez lauri=True
drapeau lors de la connexion et passez dans unfile:
URI, et ajouter unmode=rw
paramètre de requête pour le chemin d'accès:Voir le SQLite URI Reconnu les Paramètres de la Requête documentation pour plus de détails sur quels paramètres sont acceptés.
os.path.isfile()
est juste à vous dire si un fichier existe, pas si elle existe ET est une base de données SQLite3! Sachant http://www.sqlite.org/fileformat.htmlvous pourriez faire ceci :et par la suite l'utiliser comme :
Oui, il y a un moyen de faire ce que vous voulez avec Python 3.4+.
Utiliser le
sqlite3.connect()
fonction pour se connecter, mais passer à un URI au lieu d'un chemin d'accès au fichier, et ajoutermode=rw
à sa chaîne de requête.Ici est un travail complet exemple de code:
Cela va ouvrir une base de données existante à partir d'un fichier nommé
aaa.db
dans le dossier en cours, mais déclenchera une erreur dans le cas où le fichier ne peut être ouvert ou n'existe pas:Python sqlite.connect() docs:
Voici un extrait de tous les URI option informations recueillies à partir de http://www.sqlite.org/c3ref/open.html:
Pour des raisons de commodité, voici également un Python 3.4+ fonction pour convertir un chemin ordinaire, à un URI utilisable par sqlite.connect():
C'est une fourchette (à l'aide de Python 3) en fonction de Tom Horen la réponse dequi présente une solution plus complète et plus fiable que les élus de réponse.
Les élus de réponse, ne pas évaluer tout contenu, en-tête, etc., afin de déterminer si le fichier contient des données relatives à une base de données SQLite3 ou pas.
J'ai essayé de présenter quelque chose de plus pragmatique ici:
Je suis en utilisant une fonction comme le suivant au début de mon script pour que je puisse essayer de comprendre pourquoi un sqlite3 db script ne fonctionne pas. Comme les commentaires le disent, il utilise 3 phases, vérifie si un chemin existe pas, vérifie si le chemin est un fichier, vérifie si le fichier d'en-tête est un sqlite3-tête.