Grâce à sqlite, nous pouvons travailler sur une base de données en lecture et en écriture. Cette base constitue la source de données pour le programme. Pour ce TP, nous reprenons la base bibliothèque du TP2. Nous allons consulter et modifier les données de cette base dans un programmme Python comme dans le TP3.
TP4
. import sqlite3 import os, sys def connecte_base(db_name): try: assert os.path.isfile(db_name) db = sqlite3.connect(db_name) print("Connexion à ", db_name, "OK.") return db except: print("Erreur de connexion : la base n'existe pas!") sys.exit() db = connecte_base("biblio.db") c = db.cursor()
Testez la requête permettant d’afficher tous les livres de la base et n’afficher que l’auteur et le titre de chaque livre. Reprenez au choix une des requêtes 8, 9 ou 10 du TP2 et affichez son résultat.
Attention. Pensez à lancer vos requêtes à l’aide d’un try..except
pour pouvoir lire les erreurs sans interrompre le programme
try: liste_tuples = c.execute("SELECT ... ").fetchall() for t in liste_tuples: print(t) except sqlite3.OperationalError as err: print("Erreur SQL :" + err.args[0])
Les objets de type Membre
vont nous servir à stocker les informations contenues dans la table Membre.
Membre
(correspondant à la table Membre de la base) dont les attributs correspondent exactement à ceux de la table : idMembre
, nomMembre
, adrMembre
et cpMembre
.emprunts
servant à stocker les identifiants des livres empruntés sous la forme d’une liste de chaînes de caractères (initialement vide).
Ajoutez dans votre projet un fichier membre.py
contenant les définitions suivantes :
class Membre: def __init__(self, idMembre, nomMembre, adrMembre, cpMembre): self.idMembre = idMembre self.nomMembre = nomMembre self.adrMembre = adrMembre self.cpMembre = cpMembre self.emprunts = [] def emprunte(self, idLivre): self.emprunts += [idLivre]
Vous devez maintenant tester le bon fonctionnement de cette classe:
Membre
dans le programme principal (from membre import Membre
)m
de type Membre avec des valeurs quelconques m.idMembre
m.nomMembre
m.adrMembre
m.cpMembre
"7089PQIU"
, toujours en notation pointée : m.emprunte(…)
m.emprunts
p
de type Membre avec ces donnéesp.emprunts
p
.Les accesseurs d'objets (Data Access Object – DAO) sont des interfaces permettent d'implémenter ces opérateurs:
Nous créerons ici une classe MembreDAO
servant à interfacer les objets de la classe Membre
avec la base de données.
Le constructeur prend comme paramètre le nom de la base de données et initialise l'unique attribut db
.
membreDAO.py
à votre projetimport sqlite3, os, sys from membre import Membre class MembreDAO: def __init__(self, db_name): try: assert os.path.isfile(db_name) db = sqlite3.connect(db_name) print("Connexion à ", db_name, "OK.") self.db = db except: print("Erreur de connexion : la base n'existe pas!") sys.exit()
a
de type MembreDAO
dans le programme principal.
Ajoutez à la classe MembreDAO
une méthode nommée getMembreById
qui :
def getMembreById(self, idMembre): ...
a
créé précédemment pour définir l'objet monet
d'identifiant 15, soit:monet = a.getMembreById(15)
monet
La méthode createMembre
sert à ajouter un nouveau membre dans la base de données. Elle :
INSERT INTO Membre …
) def createMembre(self, membre): ...
membre
. Il est conseillé d'utiliser la syntaxe suivante :
c.execute("INSERT INTO Membre VALUES (?,?,?,?)", (membre.idMembre, membre.nomMembre, membre.adrMembre, membre.cpMembre))
membre
n'est pas déjà présent dans la base. Dans ce cas, il ne se passe rien (seul un message d'erreur s'affiche)!self.db.commit()
Testez cette fonction dans le programme principal utilisant le membre que vous avez créé à la question 2 (pensez à lui attribuer un identifiant vierge, par exemple 31).
Si tout se passe bien, rien ne s'affiche mais il est possible de verifier que l'objet d'identifiant 30 a bien été inscrit dans la base à l'aide de la fonction getMembreById
définie précédemment.
Définissez une méthode deleteMembre
permettant de supprimer un membre dans la base de données à l'aide de son identifiant (DELETE FROM Membre WHERE …
).