indiceLivre = len(self.livres)
self.beginInsertRows(QModelIndex(),indiceLivre,indiceLivre)
self.livres.append(livre)
self.endInsertRows()
On crée ici une requête INSERT qui contient des paramètres formels (préfixés par deux
points). Ces paramètres sont ensuite remplacés, via les appels à bindValue, par les
valeurs correspondantes du livre à ajouter. Puis, l'exécution de la requête par
query.exec_() ajoute effectivement le livre donné de la table books en base de
données.
Expliquons quelques points concernant l'assignation des paramètres.
Pour faire le lien avec les attributs codés en Python, on a utilisé des paramètres
formels ayant une convention et une langue différente de celles suivies dans la
base de données. Cela ne pose aucun problème technique, cela illustre juste un
problème assez fréquent en informatique quand deux mondes de culture différente
se rencontrent, en l'occurrence celui de la programmation en Python/PyQt et celui
des bases de données. Idéalement, quand c'est possible, on veillera à uniformiser
les conventions. Sinon, on veillera à ce que les interfaces vers la base de données
soient bien localisées et encapsulées.
Pour le paramètre formel :idGenre, on utilise le dictionnaire self.idParGenre
lu à partir de la table genre de la base de données ; on retrouve ainsi facilement
l'identificateur associé au libellé livre.genre (par exemple : Historique → 3).
On a mis la valeur spéciale NULL pour le champ bookId ; c'est une manière de
demander à SQLite de choisir lui-même un numéro unique pour le nouveau livre
(il fait cela par simple incrémentation). C'est un des services qu'offrent les
SGBD ; il peut être très utile pour garantir qu'il n'y ait pas de doublons dans les
applications multiutilisateurs. Après insertion dans la base de données, il faut
retrouver l'identificateur assigné par le SGBD via la méthode lastInsertId() et
le stocker dans le livre en mémoire ; à cette fin, comme un tuple Python est non
modifiable, on crée un nouveau tuple Livre avec l'identificateur en premier
argument suivi des autres attributs inchangés à partir de l'indice 1 (l'expression
Python utilisée ici est équivalente à Livre(idLivre,livre[1],livre[2],
…,livre[7])).
Passons ensuite à la méthode supprimeLivre (les trois dernières lignes sont
inchangées).
def supprimeLivre(self,indiceLivre):
167
self.beginInsertRows(QModelIndex(),indiceLivre,indiceLivre)
self.livres.append(livre)
self.endInsertRows()
On crée ici une requête INSERT qui contient des paramètres formels (préfixés par deux
points). Ces paramètres sont ensuite remplacés, via les appels à bindValue, par les
valeurs correspondantes du livre à ajouter. Puis, l'exécution de la requête par
query.exec_() ajoute effectivement le livre donné de la table books en base de
données.
Expliquons quelques points concernant l'assignation des paramètres.
Pour faire le lien avec les attributs codés en Python, on a utilisé des paramètres
formels ayant une convention et une langue différente de celles suivies dans la
base de données. Cela ne pose aucun problème technique, cela illustre juste un
problème assez fréquent en informatique quand deux mondes de culture différente
se rencontrent, en l'occurrence celui de la programmation en Python/PyQt et celui
des bases de données. Idéalement, quand c'est possible, on veillera à uniformiser
les conventions. Sinon, on veillera à ce que les interfaces vers la base de données
soient bien localisées et encapsulées.
Pour le paramètre formel :idGenre, on utilise le dictionnaire self.idParGenre
lu à partir de la table genre de la base de données ; on retrouve ainsi facilement
l'identificateur associé au libellé livre.genre (par exemple : Historique → 3).
On a mis la valeur spéciale NULL pour le champ bookId ; c'est une manière de
demander à SQLite de choisir lui-même un numéro unique pour le nouveau livre
(il fait cela par simple incrémentation). C'est un des services qu'offrent les
SGBD ; il peut être très utile pour garantir qu'il n'y ait pas de doublons dans les
applications multiutilisateurs. Après insertion dans la base de données, il faut
retrouver l'identificateur assigné par le SGBD via la méthode lastInsertId() et
le stocker dans le livre en mémoire ; à cette fin, comme un tuple Python est non
modifiable, on crée un nouveau tuple Livre avec l'identificateur en premier
argument suivi des autres attributs inchangés à partir de l'indice 1 (l'expression
Python utilisée ici est équivalente à Livre(idLivre,livre[1],livre[2],
…,livre[7])).
Passons ensuite à la méthode supprimeLivre (les trois dernières lignes sont
inchangées).
def supprimeLivre(self,indiceLivre):
167
