Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
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'.
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é.
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.
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() 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).
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)
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.
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.
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()
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.
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".
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.
Maintenant vous êtes prêt à aborder la programmation d'une vue de la base.
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.
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 !
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".