définis dans le tuple nommé Livre, on peut se permettre d'instancier chaque tuple
livre en faisant une expression génératrice équivalente à Livre(query.value(0),
query.value(1), … , query.value(7)) ; chaque livre est ensuite placé dans la
liste self.livres, comme dans la première version de BiblioApp.
On termine par une petite méthode qui va renvoyer la liste des libellés des genres,
qui sont les clés du dictionnaire qui a été construit dans litBD. Cette méthode est
utile pour bien encapsuler la structure de données interne du modèle.
Bien évidemment, l'intérêt de la table genre est peu perceptible dans ce programme. Il
y a bien sûr un gain concernant l'espace disque : le livre ne stocke qu'un code
identifiant le genre au lieu du libellé complet. Toutefois, l'intérêt principal apparaîtra
quand on voudra par exemple modifier le libellé d'un genre : il suffira d'un UPDATE sur
un enregistrement de la table genre.
Nous allons à présent modifier les méthodes ajouteLivre, remplaceLivre et
supprimeLivre pour faire une mise à jour directe dans la base de données (plus
besoin de demander à l'utilisateur de faire des sauvegardes). La signature de ces
méthodes reste inchangée et l'implémentation actuelle qui met à jour le modèle va être
augmentée d'un prétraitement pour que cette mise à jour soit persistante.
Voici la méthode ajouteLivre mise à jour (les quatre dernières lignes sont
inchangées) :
def ajouteLivre(self,livre):
query = QSqlQuery()
query.prepare(''' INSERT INTO books
(book_id, title, author, publisher,
genre_id, year, summary, price)
VALUES (NULL, :titre, :auteur, :editeur,
:idGenre, :annee, :resume, :prix)
''')
query.bindValue(":titre",livre.titre)
query.bindValue(":auteur",livre.auteur)
query.bindValue(":editeur",livre.editeur)
query.bindValue(":idGenre",self.idParGenre[livre.genre])
query.bindValue(":annee",livre.annee)
query.bindValue(":resume",livre.resume)
query.bindValue(":prix",livre.prix)
query.exec_()
idLivre = query.lastInsertId()
livre = Livre(idLivre,*livre[1:])
166
Précédent

- 167/494

Suivant