Formation PUB400 : Python, 2018 Python et SQLite

4.3 Branchement à une BD : version plus robuste


Prenons l'extrait de code suivant qui manque un peu de robustesse :

Python

try:
    connexion = sqlite3.connect('mabd.db')
    ...
 
except sqlite3.OperationalError as e:
    ...
 
except Exception as e:
    ...
 
finally:
    connexion.close()

Deux problèmes se posent :

  • Si la base de données n'existe pas, Python va la créer. Le programme plantera plus loin lorsqu'il tentera d'accéder à une table puisque la BD sera vide.
  • Si le branchement à la BD ne fonctionne pas le programme plantera sur le finally car il tentera de refermer une connexion qui n'existe pas.

Voyons comment régler ces problèmes.

Ne pas créer une base de données vide si n'existe pas

Par défaut, la fonction sqlite3.connect() créera une base de données vide si la base de données demandée n'existe pas. Dans le jargon de SQLite, on dira que la BD est ouverte en mode "rwc" (Read Write Create).

Si ce comportement est souhaitable dans certaines situations précises, il ne n'est pas dans la majorité des situations.

Pour éviter cela, on ouvrira la base de données en mode "rw" (Read Write).

Ex :

Python

connexion = sqlite3.connect('file:mabd.db?mode=rw', uri=True)

Si on tente d'ouvrir une base de données qui n'existe pas, une erreur de type sqlite3.OperationalError sera levée et pourra être interceptée grâce au try... except.

Bien réagir si la connexion ne fonctionne pas

Si le branchement à la base de données ne fonctionne pas, une exception sera levée et attrapée par une clause except. Cependant, dans la clause finally, on tente de refermer la base de données mais puisque la variable de connexion n'a pas pu être créée, le programme plantera.

Pour contrer ce problème, nous allons :

  • Initialiser la variable connexion à None avant de tenter la connexion.
  • Ajuster le message d'erreur pour indiquer s'il s'agit d'une erreur de connexion ou d'une erreur dans une requête SQL.
  • Vérifier si elle ne vaut pas None avant de tenter de refermer la connexion.

Voici donc la version plus robuste de cet extrait de code :

Python

try:
    connexion = None
    connexion = sqlite3.connect('file:mabd.db?mode=rw', uri=True)
    ...
 
except sqlite3.OperationalError as e:
    if connexion is None:
        print('La connexion à la base de données a échoué.')
    else:
        print('Il y a une erreur dans la requête SQL.')
 
    traceback.print_exc(file=sys.stdout)
 
except Exception as e:
    print('Une erreur inattendue est survenue.')
    traceback.print_exc(file=sys.stdout)
 
finally:
    if connexion is not None:
        connexion.close()

Ou, si vous préférez :

Python

try:
    connexion = None
    connexion = sqlite3.connect('file:mabd.db?mode=rw', uri=True)
    ...
 
except sqlite3.OperationalError as e:
    if not connexion:
        print('La connexion à la base de données a échoué.')
    else:
        print('Il y a une erreur dans la requête SQL.')
 
    traceback.print_exc(file=sys.stdout)
 
except Exception as e:
    print('Une erreur inattendue est survenue.')
    traceback.print_exc(file=sys.stdout)
 
finally:
    if connexion:
        connexion.close()

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre