Gestion et usage des bases de données en PyQt
Introduction
1. Les bases de données relationnelles
Le développement d’application « desktop », comme nous le faisons en développement PyQt, implique fréquemment l’usage de bases de données, et ce pour répondre en premier lieu au besoin de faire persister des données au-delà même de leur manipulation au cours d’une session. Une application PyQt est donc en mesure d’accéder à une base de données pour la requêter, c’est-à-dire pour interroger son contenu mais également pour modifier celui-ci (ajouter des données, les modifier et les supprimer).
Il existe différentes familles de bases de données. La plus importante et la plus utilisée est celle des bases de données relationnelles.
On entend par « base de données relationnelle » une base dans laquelle les données sont stockées dans des tables. Chaque ligne de la table est nommée un tuple. Les tables sont reliées entre elles par des relations de cardinalité obtenues par l’utilisation des clés primaires et étrangères.
Une base de données relationnelle est créée, gérée, administrée par un système de gestion de base de données relationnelle (SGBDR). Les plus célèbres sont MySQL, PostgreSQL ou encore SQLite. Il en existe beaucoup d’autres.
Le langage informatique utilisé pour requêter ce type de bases de données est fréquemment et habituellement le langage SQL (Structured Query Language).
Le propos du présent livre n’est évidemment pas de fournir un cours sur le langage SQL ni sur les bases de données...
Exemple détaillé PyQt et SQLite
1. Création de la base de données
Pour créer la base de données, nous aurons besoin du sous-module de PyQt dédié aux bases de données relationnelles, que l’on importe en début de code.
from PyQt5 import QtSql
Nous allons créer une base de données incluant des titres de livres d’informatique. Nous stockerons également dans la base de données le sujet du livre (C#, Python, Java, etc.), ainsi que l’identité de l’auteur ou de l’autrice.
Il y aura donc trois tables dans la base de données : une table des titres d’ouvrages, une table des auteurs et une table des sujets techniques. On considère ici qu’un ouvrage n’a qu’un seul auteur et qu’un seul sujet technique.
Un sujet technique (Python par exemple) sera lié potentiellement à plusieurs ouvrages. Ce sera également le cas d’un auteur, qui pourra être lié, lui aussi, à plusieurs ouvrages. Il existe ainsi une relation « un à plusieurs » entre respectivement les tables SUJET et PERSONNE, d’une part, et la table LIVRE, d’autre part.
Bien sûr, cette modélisation est imparfaite et n’épouse pas toutes les situations : elle nous permet toutefois d’ébaucher un stockage structuré d’informations sur le sujet.
Représentons ce que l’on appelle le modèle de données à l’aide d’un diagramme de classes UML simplifié permettant de représenter les cardinalités des deux relations. Dans ce diagramme, le « plusieurs » de « relation un à plusieurs » est représenté par le symbole « * ».

Diagramme de classes simplifié
Ce diagramme de classes nous permet d’établir le schéma physique de données (SPD), c’est-à-dire, et en quelque sorte, le « plan » de la base de données.
Un schéma physique de données décrit la manière dont les données sont réellement stockées dans une base de données, incluant les structures de stockage, les index, les partitions, les types de données et les relations physiques entre...
Plus loin avec l’utilisation de QSqlTableModel
1. Introduction
L’utilisation des bases de données relationnelles en PyQt offre une grande puissance, comme nous l’avons vu précédemment, en exploitant SQL de manière fluide et efficace. Cependant, PyQt va encore plus loin en proposant des classes dédiées qui simplifient l’intégration des bases de données avec l’interface graphique. Parmi elles, QSqlTableModel permet, en seulement quelques lignes, de lier directement une table SQL à un contrôle graphique, rendant ainsi l’affichage et la gestion des données particulièrement intuitifs. Cette approche réduit considérablement la complexité du développement en fusionnant la gestion des données et leur affichage dans l’interface, évitant ainsi la redondance entre la manipulation des requêtes SQL et la mise à jour des widgets.
2. Exemple d’utilisation
Le paradigme MVC (Modèle-Vue-Contrôleur) étudié précédemment nous permet de séparer la logique des données de leur affichage.
Dans cet exemple, nous associons, selon ce paradigme, une vue graphique (fenêtre affichant les données) avec un modèle (une table d’une base de données). Cela permet d’afficher et de modifier directement les données de la table SUJET...
L’utilisation de QSqlRelationalTableModel
1. Introduction
Dans l’exemple précédent, nous avons exploité QSqlTableModel pour afficher et manipuler les données d’une table simple, sans clé étrangère. Cette approche a l’avantage de la simplicité, mais elle devient rapidement limitée lorsqu’une table contient des relations avec d’autres tables via des clés étrangères. En effet, si nous affichons une colonne contenant une clé étrangère, l’interface graphique ne montrerait que l’identifiant numérique, ce qui n’est pas intuitif pour l’utilisateur.
Pour pallier ce problème, QSqlRelationalTableModel permet d’établir des liaisons entre les tables et de remplacer automatiquement les identifiants par leurs valeurs correspondantes dans les tables référencées. Grâce à cette classe, il devient possible d’afficher des informations compréhensibles, comme un nom ou un titre, plutôt qu’un simple identifiant numérique. De plus, elle facilite également la sélection des valeurs associées, rendant l’édition des relations entre tables plus ergonomique et efficace dans une interface PyQt.
2. Exemple d’utilisation
Comme d’habitude, commencez par importer les différentes classes nécessaires au bon fonctionnement du programme :
import sys
from PyQt6.QtWidgets import QApplication, QVBoxLayout...Le mapping de données avec QDataWidgetMapper
1. Introduction
Dans les exemples précédents, nous avons exploré comment relier un modèle de données à une vue afin d’afficher une table complète sous forme de tableau interactif. Cette approche est idéale lorsque l’on souhaite visualiser et manipuler plusieurs enregistrements simultanément dans une interface graphique.
Cependant, dans de nombreux cas, un affichage tabulaire ne correspond pas aux attentes. Il est souvent plus pertinent d’afficher les détails d’un seul enregistrement à la fois, sous forme de fiche interactive. Par exemple, dans une application de gestion de bibliothèque, au lieu d’afficher tous les livres en même temps, il peut être préférable de présenter les détails d’un livre spécifique, avec des champs modifiables pour son titre, son auteur ou son sujet.
Dans cette approche orientée fiche, une classe comme QSqlRelationalTableModel, conçue pour gérer des listes et des relations entre tables, devient inadaptée. À la place, nous utilisons la classe QDataWidgetMapper, qui permet de lier dynamiquement des widgets individuels (QLineEdit, QComboBox, etc.) à un modèle de données. Grâce à cet outil, nous pouvons naviguer entre les enregistrements d’une table tout en affichant leurs détails sous une forme intuitive et modifiable.
2. Exemple d’utilisation
L’objectif de cet exemple est de créer une interface graphique permettant de naviguer entre les lignes d’une table en affichant une ligne à la fois sous forme de fiche détaillée. Nous utiliserons ici la table SUJET, et permettrons à l’utilisateur de passer d’un enregistrement à un autre à l’aide de boutons de navigation.
Cette approche est particulièrement utile lorsque l’on souhaite...
Conclusion
Ce chapitre nous a offert une exploration approfondie des nombreuses possibilités d’intégration des bases de données relationnelles dans une application PyQt6. Nous avons vu comment connecter une base de données SQLite, afficher et manipuler des données avec QSqlTableModel et QSqlRelationalTableModel, puis exploiter QDataWidgetMapper pour une présentation plus intuitive sous forme de fiche. Ces outils permettent de gérer efficacement des données complexes tout en offrant une expérience utilisateur fluide et ergonomique.
L’intégration des bases de données dans PyQt6 constitue une base essentielle pour le développement d’applications modernes, qu’il s’agisse d’un logiciel de gestion, d’une interface d’administration ou d’un outil interactif de visualisation de données. La capacité de lier des modèles de données à des vues graphiques, tout en assurant une édition en temps réel, ouvre la porte à des développements plus avancés et performants.
Dans la suite de notre exploration, nous allons nous intéresser à la gestion du son et de la vidéo avec PyQt6. Cette thématique nous permettra d’explorer les outils multimédias intégrés à PyQt, avant d’aborder une autre dimension cruciale des applications modernes...