Accueil

Traduction

Tutoriel Python - sommaire

Tutoriel Python - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Manipuler une base de données SQLite avec Python

Dans le chapitre précédent nous avons manipulé une BD sqlite à partir du logiciel DB browser.
Mais on peut (et heureusement) manipuler cette base via l'interpréteur Python ou dans le cadre d'un programme Python.
Je vous rappelle que la BD "animaux.db" comprend deux tables : 'especes' & 'taxons' avec un champ de jointure entre ces deux tables : 'code'.

Manipuler une base de données SQLite à partir de l'interpréteur

Attention : les requêtes SQL doivent être "encapsulées" dans une commande Python.
Familiarisons nous avec cette syntaxe particulière d'abord à partir de l'interpréteur puis nous passerons au mode programmé.

Commandes à saisir dans l'interpréteur Python

Il y a beaucoup à dire sur cette batterie de commandes ...
La base de données "animaux.db" est stockée dans le dossier "python_prog". Or le répertoire par défaut pour l'interpréteur est "python39". Il faut donc changer de répertoire courant et donc importer le module "os" pour disposer de la fonction chdir().
Il faut manipuler une base de données SQLite, il faut donc importer le module "sqlite3" .
Il faut ensuite se connecter à une base de données avec la méthode connect() du module sqlite3.

Ensuite il faut créer un objet de type cursor(). Ici cet objet est nommé "curseur".
C'est cet objet qui récupère le résultat d'une requête sélection.
On peut appliquer à cet objet "cursor" la méthode execute() qui permet d'appeler n'importe quel type de requête SQL.
curseur.execute("SELECT * from taxons;") : pour récupérer dans l'objet "cursor" tout le contenu de "taxons".
for resultat in curseur : l'objet de type cursor est itérable.
Notez que les contenus sont retournés sous forme de tuples ! Ce n'est donc pas très lisible à cause des parenthèses, des guillemets simples qui parasitent l'affichage.

Autres méthodes applicables à l'objet "cursor()"

La méthode fetchone()

La méthode fetchone(), appliquée à l'objet de type cursor(), permet de récupérer l'enregistrement courant sous forme d'un tuple.
C'est ce que nous voyons ci-dessous.

La méthode fetchall()

La méthode fetchall() appliquée au curseur permet de récupérer toutes les lignes correspondant à la requête sous forme de tuples.
Pour se débarrasser des parenthèses, crochets, guillemets il suffit de pratiquer le "slicing" (ou tranchage). Par exemple écrire print(ligne[1], ligne[3], ligne[4]) au lieu de print(ligne).

Requête sélection avec filtrage

On veut récupérer une ligne d'une vue. Le critère de filtrage est une constante.

La requête sélectionne l'enregistrement dont l'id vaut 4.
curseur.fetchone() : affiche cette ligne sous la forme d'un tuple.

Plus difficile maitenant : le critère de filtrage est une variable !

Nous affectons 20 dans une variable et nous voulons qu'ensuite ce soit l'enregistrement dont l'id correspond au contenu de la variable qui s'affiche.
Comme vous voyez ci-dessus la syntaxe est particulière : select ... id =?", (nomVariable)

Requête sélection de type "select max ..."

Une requête sélection de type SELECT MAX … retourne une seule ligne.

tuple = curseur.fetchone() : la méthode fetchone() retourne un tuple dont le contenu est (24,) 
Avec le "slicing" on récupère uniquement le nombre 24.

Requête sélection statistique avec regroupements

Je veux parler d'une requête de type "select ... group by ..." .

contenu = curseur.fetchall() : retourne 6 tuples car il y a 6 valeurs distinctes dans la colonne "especes2.code"
Toujours avec le "slicing", on se débarrasse des parenthèses et des guillemets.

Se déconnecter de la base de données

N'oubliez pas de ferme la connexion avec la BD.
Il faut appliquer la méthode close() à l'objet de type "connect" et comme cet objet se nomme "connexion", la commande est :connexion.close()

L'objet de type "cursor" est parfois facultatif

Un court programme pour lire séquentiellement la table "taxons".

Comme ce programme est stocké dans le même répertoire que la BD, la commande chdir est inutile ; le dossier par défaut est c:/python_prog
Dans chacune des deux boucles, j'applique ici la méthode execute() directement à l'objet de type "connect". L'objet de type "cursor" est donc implicite.
Notez l'emploi du "slicing" pour les affichages.

Un programme pour ajouter des lignes dans la table 'especes'

Nous allons maintenant manipuler une table (ou une vue) de la BD via des programmes.

Thème : programme qui ajoute de nouvelles lignes à la table "especes".

Le code

Ce programme et la base de données étant stockés dans le même répertoire, l'instruction "chdir ... " est ici inutile.
Pour une requête qui modifie le contenu d'une table (ajout-suppression) il faut valider la modification avec la commande commit()

Trace d'exécution du programme (extrait) :

Nous avons d'abord l'affichage de la table "taxons" en guise d'aide-mémo (pour connaitre les codes des différents taxons). Ce programme fonctionne mais n'est pas très ergonomique ...
Il serait préférable que les saisies se fasse au travers d'un formulaire plutôt qu'avec des commandes de type "input".
Dans le chapitre suivant vous trouverez une version améliorée de ce programme.

Progamme de jeu qui exploite une base de données

Maintenant vous êtes prêt à aborder la programmation d'une vue de la base.

Thématique

Le joueur doit classer des espèces d'animaux marins. Dix espèces sont tirées au sort. Pour chaque espèce le joueur doit préciser le taxon correspondant : saisie du code du taxon.
Le score maximal est 10.

Le code du programme

Le code de la vue "vue4" qui est appelée dans ce programme

Je rappelle que le code SQL correspondant à cette vue est :
CREATE VIEW "vue4" AS select * FROM especes, taxons WHERE especes.code = taxons.code ;
Ordre des champs de la vue : id, nom_espece, especes.code, taxons.code, nom_taxon
Donc pour "slicer" le champ "nom_espece" l'indice correspondant est 1 !

Trace du programme

Commentaire

Le programme a besoin des modules random & sqlite3
Le programme affiche d'abord un "pense-bête" : la liste des taxons avec pour chaque son code donc faire appel à la table "taxons" ordonnée sur "nom_taxon".
Il faut récupérer la valeur maximale du champ "id" de la "vue4". Cette valeur est stockée dans la variable "n".