Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Dans le chapitre précédent nous avons manipulé une base de donnée SQLite à partir du logiciel DB browser(for SQLite).
Mais on peut manipuler cette base via l'interpréteur Python ou dans le cadre d'un programme Python.
Je vous rappelle que la base "animaux.db" comprend deux tables : 'especes' & 'taxons' avec un champ de jointure entre ces deux tables : 'code'.
Nous alons tout d'abord utiliser la console Python.
Attention, la base de données "animaux.db" est stockée dans le dossier "c:\python_prog". Or le répertoire par défaut pour l'interpréteur est
"c:\python39". Il faut donc changer de répertoire courant et donc importer le module "os" pour disposer de la fonction chdir().
Pour 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".
On peut appliquer à cet objet "cursor" la méthode execute() qui permet d'appeler n'importe quel type de requête SQL.
Éxaminons quelques commandes :
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.
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.
Rappel de la syntaxe de "vue1" : CREATE VIEW "vue1" AS SELECT nom_espece, taxons.code, nom_taxon FROM especes INNER JOIN taxons ON especes.code = taxons.code
Cette méthodé 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).
Voir l'exemple qui suit.
Cette méthode permet de récupérer un nombre de lignes correspondant à la valeur passée en paramètre.
En supposant que vous êtes connecté à la base "animaux.db", Les commandes qui suivent sont :
On affiche bien 10 lignes.
La requête sélectionne l'enregistrement dont l'id vaut 4.
curseur.fetchone() : affiche cette ligne sous la forme d'un tuple.
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)
contenu = curseur.fetchall() : retourne 14 tuples car il y a 14 valeurs distinctes dans la colonne "especes.code"
Avec le "slicing", on se débarrasse des parenthèses et des guillemets.
N'oubliez pas de fermer la connexion avec la base.
Il faut appliquer la méthode close() à l'objet de type "connect" et si cet objet se nomme "connexion",
la commande est alors : connexion.close()
Nous allons maintenant passer au mode programmé avec l'IDLE comme environnement de travail.
Je vous propose tout d'abord un programme qui parcoure la vue "vue1".
CREATE VIEW "vue1" AS SELECT nom_espece, taxons.code, nom_taxon FROM especes INNER JOIN taxons ON especes.code = taxons.code
Cette vue mémorise une requête sélection multitables : associer à chaque enregistrement de "especes" une ligne de "taxons".
Le programme et la BD étant stockés dans le même répertoire (c:\python_prog), l'instruction "chdir ... "
est ici inutile.
Notez qu'en SQL on manipule une vue comme une table.
Trace d'éxécution dans l'IDLE (extrait) :
talitre amph amphipodes ver bobbit anne annélidés fraise de mer asci ascidies cione asci ascidies soleil de mer aste astérides moule commune biva bivalves ...
Maintenant un programme qui lit la table "especes".
Pour afficher les champs nous allons utiliser leur nom plutôt que leur indice.
Le code :
Notez l'instruction connexion.row_factory =sqlite3.Row qui va nous permettre d'utiliser les noms de champs à la place de leur indice : print(ligne['id'], ligne['nom_espece'], ligne['code'])
Trace d'exécution dans l'IDLE (extrait) :
1 homard deca 4 crevette grise deca 5 bouquet deca 6 étrille deca 7 tourteau deca 8 araignée de mer deca 9 bulot gast 10 patelle gast ...
Supprimons au préalable les poissons osseux de la table "especes" via la console Python :
... >>> curseur.execute("delete from especes where code ='osse' ")>>> connexion.commit()
Il faut toujours confirmer la modification des données dans une base avec la méthode commit().
Ce programme et la BD étant stockés dans le même répertoire (c:\python_prog), l'instruction "chdir ... " est ici inutile.
Ici je vous montre comment intégrer des requêtes SQL INSERT dans un programme Python.
La variable un_poisson contient un tuple décrivant une seule espèce. La syntaxe pour insérer une seule ligne est :
curseur.execute(requête insert, nomTuple)
la variable autres_poissons est une liste de 5 tuples. La syntaxe pour insérer 5 nouvelles lignes est :
curseur.executemany(requête insert, nomListedeTuples). Oui, vous avez bien lu executemany()
Il faut valider la modification de la table avec la commande commit() puis
il faut se déconnecter de la base.
Pour vérifier que 6 lignes (1 + 5) ont bien été ajoutées à la table "especes" il suffit de relancer le programme "lire_vue1.py" :
Trace d'exécution du programme :
... murène osse poissons osseux hareng osse poissons osseux maquereau osse poissons osseux morue osse poissons osseux sardine osse poissons osseux baudroie osse poissons osseux ...
Donc six enregistrements ont bien été ajoutés.
C'est quand même plus pratique lorsque c'est l'utilisateur qui saisit les données.
La méthode execute() comprend deux paramètres : code SQL, tuple de variables.
Trace d'exécution du programme :
SAISIR DE NOUVELLES ESPECES nom de l'espèce : truite code du taxon corrrespondant : osse nom de l'espèce : saumon code du taxon corrrespondant : osse nom de l'espèce : fin >>>
Ce programme fonctionne mais n'est pas très ergonomique ... L'utilisateur doit connaitre par coeur les codes des différents taxons.
Sachez que tout cela est possible à condition d'utiliser le module tkinter ; voir le chapitre suivant.