truc2geek

2012/05/19

Python, part 3 : utiliser sqlite3 dans le shell

Filed under: Python, SQLite — Étiquettes : , , , , , , , , , , — truc2geek @ 22:32

importer un module

les fonctions qui permettent d’utiliser sqlite3 sont groupées dans le module ‘sqlite3’, qui est livré avec Python mais doit être appelé explicitement comme suit :
import sqlite3

pour importer un module, Python le cherche d’abord dans le dictionnaire sys.modules ; si non trouvé, le cherche dans les dossiers listés dans la variable d’environnement PATH (source : FAQ Python sur Developpez.com)

pour connaître les modules listés dans sys.modules :

voici le message d’erreur qui s’affiche si on tente d’utiliser un module sans l’avoir importé :

pour connaître les chemins listés dans sys.path :

importer et utiliser un module perso

on peut ajouter un chemin en utilisant sys.path.append()
exemple avec un module nommé « Test1.py », stocké sous « H:\PROG », contenant les fonctions « DonneeFloat » et « SaisirFloat » :

on importe et utilise ce module depuis le shell Python :

utiliser le module sqlite3 dans le shell

afficher le contenu d’une table/requête

on reprend la BD dans son état à la fin de l’article « SQLite, part 5 » (à télécharger ici)

afficher le contenu d’une table/requête :

on se connecte à la BD, on crée un objet cursor() à partir duquel on manipulera la BD ensuite.
ici on exécute une requête de sélection, et on boucle sur le contenu de curs (l’objet cursor) : tous les enregistrements retournées par la requête.
on a un problème d’affichage des caractères accentués.

on essaie avec cp1252, uniquement pour les 2e et 3e champs (le 1er est le champ [id_societe] qui ne contiendra que des chiffres)

parenthèse : les variables de type tuple

on traite les champs un par un, en utilisant row[x], comme pour faire référence aux éléments d’une liste.
on vérifie le type de row :

le type de variable tuple est proche du type liste, mais une liste est modifiable et un tuple ne l’est pas.
un tuple se déclare avec des parenthèses, et non des crochets.
pour déclarer un tuple contenant une seule valeur, placer une virgule après cette valeur (sinon la variable sera de type string)

on ferme la parenthèse, retour au problème : afficher le contenu d’une table avec les caractères spéciaux

les deux premiers enregistrements se sont bien affichés, le troisième a généré une erreur NoneType
ce 3e enregistrement ne contient pas de valeur pour le champ « info »

on essaie avec un bloc try-except, pour n’afficher que les deux premières valeurs (id et nom) si une erreur est levée :

pour les enregistrements qui n’ont pas de valeur pour le champ « info », les deux premiers champs sont affichés en double…
ce qui signifie que, pour ces enregistrements, les deux instructions ont été exécutées : celle après le try et celle après le except.
on essaie donc la même chose mais avec simplement une chaîne vide pour l’instruction placée après le except :

commit et rollback

on exécute une requête de mise à jour, on affiche le contenu de la table T_Societe, on ferme la connexion à la BD ;
puis on s’y reconnecte, et affiche le contenu de la table T_Societe :
notre requête semblait avoir été prise en compte, mais non.

on exécute à nouveau une requête de mise à jour, et on effectue ensuite un commit, on ferme la connexion ;
on se reconnecte à la BD et affiche le contenu de la table T_Societe :
cette fois la requête a bien été exécutée, les modifications sont conservées.

on exécute une requête de suppression (Le Marché du Pêcheur), on fait un rollback
on exécute une requête de suppression (Caddie Dollar), on fait un commit
on ferme puis se reconnecte à la BD, on vérifie :

on constate que la première requête, après laquelle on a effectué un Rollback, n’a en fait pas été prise en compte.
Par contre la seconde requête, après laquelle on a effectué un Commit, a bien été prise en compte.

2 commentaires »

  1. Ton tuto est bien fait , dommage que je ne suis pas tombé dessus avant parce qu’au niveau de l’encodage j’ai du trouver la solution tout seul … :/
    Est-ce que tu aurais une solution afin de lister le nom des champs dans ta requete ? Car j’aurais besoin de cela pour evité de gerer avec un script les AS, …

    Commentaire par ziks — 2013/06/25 @ 13:39

    • pour info, a default d’avoir trouvé ce que je voulais avec la gestion de ce qu’il y avait dans le SELECT je gere tout a l’aide d’un script

      Commentaire par ziks — 2013/06/26 @ 09:47


RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Propulsé par WordPress.com.