3. Pour aller plus loin…
Dans l'exemple qui a été donné, nous avons choisi pour la facilité de charger la table
genre dans un dictionnaire Python (l'attribut idParGenre) ; c'est fait une fois pour
toutes, au démarrage de l'application et, comme nous l'avons vu, ça permet de faire
facilement les INSERT et UPDATE. Cela dit, ce n'est pas forcément le meilleur choix
pour des applications où les tables référencées sont mises à jour souvent. SQL, qui est
un langage plus riche qu'il n'y parait, permet en fait de se passer d'un dictionnaire en
faisant travailler le SGBD plutôt que le programme Python.
Voici comment les requêtes INSERT et UPDATE pourraient être transformées (sous
SQLite) pour retrouver elles-mêmes l'attribut genre_id :
query.prepare(''' INSERT INTO books
(book_id, title, author, publisher,
genre_id, year, summary, price)
SELECT NULL, :titre, :auteur, :editeur,
genre_id, :annee, :resume, :prix
FROM genres
WHERE genres.genre = :genre ''')
…
query.prepare(''' UPDATE books
SET title = :titre,
author = :auteur,
publisher = :editeur,
genre_id = (SELECT genres.genre_id
FROM genres
WHERE genres.genre =
:genre),
year = :annee,
summary = :resume,
price = :prix
WHERE book_id = :idLivre ''')
Dès lors, on pourrait faire le lien direct avec le libellé du genre littéraire :
query.bindValue(":genre", livre.genre)
Dans cette approche, l'application PyQt n'a donc même plus à connaître les valeurs de
l'attribut genre_id.
Terminons ce chapitre par quelques commentaires généraux. Comme déjà signalé,
SQLite est un SGBD simple et de bon goût qui ne convient toutefois pas pour des
171
Dans l'exemple qui a été donné, nous avons choisi pour la facilité de charger la table
genre dans un dictionnaire Python (l'attribut idParGenre) ; c'est fait une fois pour
toutes, au démarrage de l'application et, comme nous l'avons vu, ça permet de faire
facilement les INSERT et UPDATE. Cela dit, ce n'est pas forcément le meilleur choix
pour des applications où les tables référencées sont mises à jour souvent. SQL, qui est
un langage plus riche qu'il n'y parait, permet en fait de se passer d'un dictionnaire en
faisant travailler le SGBD plutôt que le programme Python.
Voici comment les requêtes INSERT et UPDATE pourraient être transformées (sous
SQLite) pour retrouver elles-mêmes l'attribut genre_id :
query.prepare(''' INSERT INTO books
(book_id, title, author, publisher,
genre_id, year, summary, price)
SELECT NULL, :titre, :auteur, :editeur,
genre_id, :annee, :resume, :prix
FROM genres
WHERE genres.genre = :genre ''')
…
query.prepare(''' UPDATE books
SET title = :titre,
author = :auteur,
publisher = :editeur,
genre_id = (SELECT genres.genre_id
FROM genres
WHERE genres.genre =
:genre),
year = :annee,
summary = :resume,
price = :prix
WHERE book_id = :idLivre ''')
Dès lors, on pourrait faire le lien direct avec le libellé du genre littéraire :
query.bindValue(":genre", livre.genre)
Dans cette approche, l'application PyQt n'a donc même plus à connaître les valeurs de
l'attribut genre_id.
Terminons ce chapitre par quelques commentaires généraux. Comme déjà signalé,
SQLite est un SGBD simple et de bon goût qui ne convient toutefois pas pour des
171
