
L'objectif de cette activité est de découvrir rapidement l'utilisation du module sqlite3 de Python afin d'accéder à une base de données et de la modifier en écrivant des requêtes SQL.

Exemples de programmes en Python
|
Voici les programmes de base montrant comment utiliser le module sqlite3 en Python. Chaque programme peut être largement amélioré en fonction de vos besoins et de vos objectifs :
Remarque : le fichier exemple.db créé en Python est parfaitement lisible et modifiable avec l'outils Sqlite du logiciel UwAmp, mais aussi avec l'outils SQLite d'EduPython disponible dans la menu Outils -> Outils -> SQLite Data Browser :

Voici la structure de la table users dans la base de données exemple.db :
Et voici les données qui y sont enregistrées :

La méthode execute de sqlite3 exécute une seule ligne de commande SQL.
La méthode executescript de sqlite3 permet d'exécuter un script SQL, c'est à dire plusieurs lignes de commande séparées par des points-virgule. Exemple d'utilisation :
Application : enregistrer une liste de liste
|
Problèmatique : nous voulons enregistrer l'état du jeu de puissance 4 en cours de partie afin de terminer la partie un autre jour. La grille du jeu Puissance 4 contenant 7 colonnes et 6 lignes est enregistrée dans Python sous forme d'une liste de liste 7x6 :

Dans cette structure de données, un 0 représente une case vide, un 1 représente un pion rouge et un 2 représente un pion bleu.
Nous allons voir 2 solutions différentes pour enregistrer une telle structure de données dans une table en SQL.
Solution 1 : on enregistre chaque case dans un champ de la table, avec 1 ligne de la grille par enregistrement.
La structure de la table est alors composées de 7 champs de type INTEGER correspondant aux 7 colonnes de la grille (champs nommés c1 à c7 dans le programme).
Comme chaque enregistrement de la table contient 1 ligne et qu'il y a 6 lignes dans la grille de Puissance 4, il faudra 6 enregistrements pour sauvegarder la grille entière dans la base de données.
Voici le programme (téléchargeable ci-dessous) qui enregistre 1 grille dans une table :

Ce programme crée un fichier de base de données nommé grille_1.bd
En ouvrant ce fichier grille_1.db dans le logiciel SQLite, on retrouve la structure de la table composée de 7 champs de type entier :

Et voici le contenu des données : 6 enregistrements dans la table users, ce qui correspond à la grille entière :

Une fois le fichier grille_1.db créé, il faut un autre programme pour le lire et reconstituer la grille dans Python.
Voici le programme (téléchargeable ci-dessous) qui lit 1 grille dans une table :

Chaque enregistrement de la table (il y en a 6 ici) est renvoyé sous forme d'un tuple. Aprés conversion des 6 tuples en liste, et ajout de ces 6 listes dans une liste grille[] initialement vide, on retrouve bien notre grille 7x6 sous forme d'une liste de liste :

Avantage de cette solution 1 : en consultant les données dans la table on retourve immédiatement la structure de la grille (6 lignes et 7 colonnes en clair)
Inconvénient de cette solution 1 : on ne peut enregistrer qu'une seule grille dans la base de données
Voyons maintenant la solution 2 qui permet d'enregistrer plusieurs grilles dans la même table.
Solution 2 : on enregistre une grille complète dans un seul champ de la table. Pour sauvegarder plusieurs grilles il suffit d'ajouter plusieurs enregistrements dans la table.
Voici le programme (téléchargeable ci-dessous) qui enregistre une grille par enregistrement dans une table :

Ce programme crée un fichier de base de données nommé grille_2.bd
En ouvrant ce fichier grille_2.db dans le logiciel SQLite, on retrouve la structure de la table composée de 3 champs :
- id : la clé primaire (de type entier)
- jeu : un champs de type texte donnant des indications sur la grille (nom du jeu par exemple, date d'enregistrement, ou autre)
- grille : un champ de type texte contenant l'intégralité de la grille sous forme d'une chaîne de caractères

Il est possible d'enregistrer plusieurs grilles dans la tables users. Voici par exemple 3 grilles différentes enregistrées :

Une fois le fichier grille_2.db créé, il faut un autre programme pour le lire et reconstituer dans Python toutes les grilles enregistrées.
Voici le programme (téléchargeable ci-dessous) qui lit toutes les grilles enregistrées dans la table users :

Chaque enregistrement de la table (accessible ici dans le tuple ligne) contient 3 champs :
- ligne[0] est la clé primaire
- ligne[1] est le nom du jeu (ici 'Puissance 4' et non utilisé)
- ligne[2] est la grille complète sous forme de chaîne de caractères
Après conversion des chaînes de caractères ligne[2] en liste de liste grâce à la fonction eval() de Python, on retrouve bien toutes les grilles enregistrés (3 grilles dans cet exemple) sous forme d'une liste de liste de dimensions 7x6 :

Avantage de cette solution 2 : il est possible d'enregistrer plusieurs grilles dans la même table
Inconvénient de cette solution 2 : la lecture directe de la base de données ne redonne pas les grilles en clair. De plus, les grilles étant enregistrées sous forme de chaînes de caractères (et non sous forme d'entiers comme dans la solution 1, ni directement sous forme de listes) il faut utiliser la fonction eval() de Python pour convertir les chaînes de caractères en liste de liste directement exploitable par Pyhton.
La base de données bibliotheque
|
La base de données bibliotheque est disponible sur le site fxjollois.github.io et possède 4 tables :

Schéma de la base de données bibliothèque
IMPORTANT : pour pouvoir importer un fichier CSV dans SQLite la dernière ligne du fichier CSV doit finir par un retour à la ligne
Travail demandé :
- Allez sur le site fxjollois.github.io puis cliquez sur Requêtage direct puis sur bibliotheque
-
À l'aide de requêtes SQL affichez l'intégralité de chacune des 4 tables, et enregistrez les tables sous forme de 4 fichiers CSV en cliquant sur le bouton CSV
-
À l'aide de l'outil SQLite de Python, reconstituez l'intégralité de la base de données bibliotheque en y important les 4 fichiers CSV et enregistrez-la dans un fichier bibliotheque.db. Vous veillerez à ce que les attributs des champs aient exectament les types indiqués en cliquant sur le bouton Tables sur le site.
- Faites un programme en Python qui affiche la table Auteur dans la console de Python. Vous formaterez l'affichage afin de représenter une structure de données par table.
- Améliorez votre programme pour qu'il affiche la table Livre dans la console.
- Améliorez votre programme pour qu'il affiche la table Emprunte dans la console.
- Améliorez votre programme pour qu'il affiche la table Lecteur dans la console.
-
Testez dans Python quelques requêtes de jointure utilisant le caractère relationnel de la base de données bibliotheque, indiqué par les clés primaires et étrangères sur le schéma ci-dessus (par exemple pour afficher tous les livres d'un auteur donné, ou pour afficher tous les livres empruntés par un lecteur donné). Le résultat de la jointure doit être afficher clairement dans la console, toujours sous forme de table formatée.
Remarque :
- la base de données de départ avec les 4 tables est créée rapidement dans SQLite en important des fichiers CSV
- le reqêtes SQL permettant de consulter la base de données sont ensuite effectuées grâce à un programme Python en utilisant le module sqlite3 et en affichant le résultat dans la console de Python
La base de données famille
|
Nous allons ici créer dans Python une nouvelle base de données qui sera enregistrée dans le fichier nommé famille.db
Cette base de données contiendra des informations simples (nom, prénom et sexe) des différentes personnes concernant plusiuers familles.
Pour obtenir un grand nombres d'enregistrements sur plusieurs personnes différentes vous utiliserez le générateur de données.
Comme dans l'activité précédente de la bibliothèque, la base de données de départ sera créée rapidement en important des fichiers CSV dans SQLite, mais c'est ensuite à Python de se connecter à la base de données en utilisant le module sqlite3 et de l'interroger grâce à des requêtes SQL appropriées afin de la consulter ou de la modifier.
Travail demandé :
Voici les différentes tâches à effectuer dans Python ou dans le logiciel SQLite d'EduPython. N'hésitez pas à automotiser certaines d'entre elles dans Python, sans faire les tâches répétitives ou laborieuses à la main dans SQLite ...
-
Créez une nouvelle base de données nommée famille.db
-
Ajoutez une nouvelle table enfant dans la base de données famille.db. Cette table devra avoir 4 attributs :
- id : clé primaire de type INTEGER PRIMARY KEY
- nom : chaîne de caractère de type TEXT
- prenom : chaîne de caractère de type TEXT
- sexe : chaîne de caractère de type TEXT valant soit 'M' soit 'F'
-
En prenant les enregistrements grâce au générateur d'informations, insérez 20 personnes dans la table enfant en utilisant la méthode de votre choix
-
Ajoutez une nouvelle table pere dans la base de données famille.db. Cette table possède les mêmes attributs que la table enfant mais doit contenir seulement des hommes
-
En utilisant le générateur d'informations, insérez 20 personnes de sexe masculin dans la table pere en utilisant la méthode de votre choix
-
Ajoutez une nouvelle table mere dans la base de données famille.db. Cette table possède les mêmes attributs que la table enfant mais doit contenir seulement des femmes
-
En utilisant le générateur d'informations, insérez 20 personnes de sexe féminin dans la table mere en utilisant la méthode de votre choix
-
Dans la table enfant, chaque personne doit avoir un père et une mère. Pour cela nous allons lier chaque enfant à ses deux parents en ajoutant des clés étrangères pointant vers les tables pere et mere.
-
Ajoutez à la table enfant une nouvelle colonne (un nouvel attribut) nommé id_pere de de type INT (cette nouvelle colonne reste vide pour l'instant) : l'attribut id_pere de la table enfant est une clé étrangère qui pointera vers l'attribut id de la table pere
-
Ajoutez à la table enfant une nouvelle colonne (un nouvel attribut) nommé id_mere de de type INT (cette nouvelle colonne reste vide pour l'instant) : l'attribut id_mere de la table enfant est une clé étrangère qui pointera vers l'attribut id de la table mere
-
Renseignez l'attribut id_pere de chacun des 20 enfants en y inscrivant l'identifiant d'un père afin de le relier à la clé primaire de la table pere (on pourra atrtibuer automatiquement un père au hasard dans Python)
-
Renseignez l'attribut id_mere de chacun des 20 enfants en y inscrivant l'identifiant d'un père afin de le relier à la clé primaire de la table mere (on pourra atrtibuer automatiquement une mère au hasard dans Python)
-
Chaque enfant possédant maintenant 2 parents, affichez pour chacun d'entre eux les nom et prénom de ses parents à l'aide d'une jointure (en plus des nom et prénom de l'enfant) dans des colonnes clairement renommées
-
Affichez toutes les personnes de la table pere qui n'ont pas d'enfant (c'est à dire que leur identifiant n'est pas utilisé dans la table enfant)
-
Affichez toutes les personnes de la table mere qui n'ont pas d'enfant (c'est à dire que leur identifiant n'est pas utilisé dans la table enfant)
-
En utilisant le générateur de données, ajoutez 20 nouveaux enfants dans la table enfant et renseignez leur père et leur mère par les relation clé étrangère / clé primaire
-
Modifiez la table enfant pour que chaque enfant porte le nom du père (en remplaçant le nom d'origine de l'enfant)
-
Affichez tous les pères et toutes les mères qui n'ont pas d'enfant
-
Affichez tous les pères et toutes les mères qui ont un seul enfant
-
Affichez tous les pères et toutes les mères qui ont plusieurs enfants
Remarques concernant la création des 3 tables :
Que faire si l'importation d'une table par un fichier CSV dans SQLite ne fonctionne pas ?
Si l'importation d'un fichier CSV dans SQLite de Python est impossible (SQLite plante systèmatiquement à l'importation du fichier CSV), vérifiez les points suivants en éditant votre fichier CSV dans l'éditeur Notepad++ :
-
il faut ajouter le nom des colonnes (nom des attributs de la table à créer) sur la première ligne du fichier CSV : "id","nom","prenom","sexe" (puis il faudra cocher Extract field names first line dans SQLite lors de l'importation)
- la dernière ligne du fichier doit finir par un retour à la ligne
- dans le Notepad++ le fichier CSV utilise les retours à la ligne Windows (CR LF), soit \r\n
-
pour éviter les problèmes avec les caractères accentués il faut encoder le fichier CSV en ANSI et non en UTF-8 (menu Encodage + Convertir en ANSI puis enregistrer le fichier modifié)
-
dans les données, les champs chaînes de caractères sont encadrés par des doubles quotes (caractère encadreur utilisé par défaut par SQLite), les champs numérique ne sont pas encadrés, et les champs sont séparés par des virgules (séparateur utilisé par défaut par SQLite)
-
dans le fichier CSV la simple quote est considéré comme une apostrophe et non comme un caractère encadrant les chaînes de caractères
-
l'importation d'un fichier CSV créera obligatoirement une nouvelle table : la table ne doit pas exister dans la base de données (ne pas créer de table vide avant l'importation du CSV)
-
la table que l'on crée ne doit pas porter comme nom un mot clé du langage SQL (elle ne peut pas s'appeler table, ou select, ou from, etc.)
-
les noms des colonnes sur la premère ligne ne doivent pas commencer par un chiffre (par exemple "1id","2nom","3prenom","4sexe" provoquera une erreur)
-
les chiffres sont autorisés dans le nom des attributs de la table à condition que ce ne soit pas le premier caractère du nom (par exemple "colonne1","colonne2","colonne3","colonne4" est autorisé)
-
les caractères spéciaux ou de ponctuation sont interdits dans le nom des attributs (par exemple "col1 : id","col2 , nom","col3 ; prénom","col4 = sexe" provoquera une erreur)
-
si le fichier CSV est encodé en ANSI alors les noms des colonnes peuvent contenir des caractères accentués (par exemple "id","nom","prénom","sexe" est autorisé), mais les caractères accentués sont à éviter
-
les apostrophes (caractère simple quote) et les espaces sont totalement ignorés dans les noms des attributs (par exemple "l'identifiant","le nom","le prénom","le sexe" donnera exactement le même résultat que "lidentifiant","lenom","leprénom","lesexe")
-
enfin, les doubles quotes ne sont pas obligatoires autour des noms des attributs sur la première ligne du fichier CSV (par exemple id,nom,prénom,sexe est autorisé)
-
préférer le navigateur Chrome au navigateur Internet Explorer pour récupérer des lignes de texte par copier/coller afin d'éviter des caractères espaces supplémentaires et indésirables
Remarques :
- seul le logiciel SQLite (version 2.0b1) d'EduPython exige que la dernière ligne du fichier CSV finisse par un retour à la ligne
-
le logiciel SQLite (version 1.3) de UwAmp n'a pas ce problème et ne plantera pas si la dernière ligne du fichier CSV ne finit pas par un retour à la ligne
-
si le fichier CSV finit par plusieurs retours à la ligne concécutifs (soit plusieurs lignes vides) alors il y aura des enregistrements vides à la fin de la table qui sera créée lors de l'importation des données
Si on créer une nouvelle table en important un fichier CSV dans SQLite les attributs de la table ne sont pas typés :

Après importation du CSV les attributs de la table ne sont pas typés
Pour typer les attributs il faut modifier les caractéristiques de la table manuellement dans SQLite :
- cliquez sur Modify table dans le menu Edit de SQLite
- sélectionnez la table concernée puis cliquez sur Edit
- sélectionnez l'attribut id, cliquez sur Edit field, choisissez le type INTEGER PRIMARY KEY, puis cliquez sur Apply Changes
- sélectionnez l'attribut nom, cliquez sur Edit field, choisissez le type TEXT, puis cliquez sur Apply Changes
- sélectionnez l'attribut prénom, cliquez sur Edit field, choisissez le type TEXT, puis cliquez sur Apply Changes
- sélectionnez l'attribut sexe, cliquez sur Edit field, choisissez le type TEXT, puis cliquez sur Apply Changes
- cliquez sur le bouton Close
- vérifiez les nouveaux types des attributs dans la structure de la table dans l'onglet Database Structure :

Maintenant les attributs de la table sont typés
Vous savez maintenant utiliser le module sqlite3 afin d'accéder à une base de données en Python grâce aux requêtes SQL.
Le logiciel SQLite directement accessible depuis Python permet d'explorer facilement une base de données (structure de la table et contenu des données).
La méthode execute de sqlite3 exécute une seule ligne de commande SQL.
La méthode executescript de sqlite3 permet d'exécuter un script SQL, c'est à dire plusieurs lignes de commande séparées par des points-virgule.
De plus, grâce à la sérialisation (fonction str(structure) en Python) et à la dé-sérialisation (fonction eval(chaine) en Python) il est possible d'enregistrer facilement sous forme de chaîne de caractères toutes sortes de structures de données dans un seul champ TEXT d'une table :
- liste simple
- liste de liste
- liste de tuple
- dictionnaire
- liste de dictionnaire
- dictionnaire de liste
- etc.

Réalisé par Jean-Christophe MICHEL
© Mars 2025