SQLite est une bibliothèque écrite dans le langage C qui propose un moteur de base de données relationnelles accessible par le langage SQL. SQLite implémente en grande partie le standard SQL-92.
Comparaison des différents paradigmes d'accès à des données externes à une application
La majorité des SGBD traditionnels tels que MySQL sont construits selon le paradigme client-serveur, c'est-à-dire qu'une bibliothèque logicielle cliente est intégrée et utilisée dans une ou plusieurs applications alors que le moteur de base de données fonctionne dans un espace d'exécution qui lui est propre, voire sur une machine différente, en tant que service informatique.
La particularité de SQLite est de ne pas reproduire le schéma client-serveur habituel mais d'être directement intégrée dans l'application qui utilise sa bibliothèque logicielle, avec son moteur de base de données. L'accès à une base de données SQLite se fait dès lors par l'ouverture du fichier correspondant à celle-ci: en effet, chaque base de données est, dans ce système, enregistrée dans un fichier qui lui est propre avec ses tables, ses index, ses déclarations de types et d'intégrité référentielle ainsi que ses données.
En résumé, l'architecture de SQLite signifie que vous pourrez écrire en Python une application contenant son propre SGBD intégré, sans qu'il soit nécessaire d'installer quoi que ce soit d'autre. Cette architecture simplifiée d'un SGBD traditionnel a néanmoins certains inconvénients. En effet, si un client accède à une base de données SQLite, la totalité de la base de données est bloquée à d'autres clients. SQLite ne permet pas donc pas d'être utilisé dans un environnement multi-utilisateur d'où son utilisation très populaire dans les systèmes embarqués.
D'une manière générale, il est conseillé d'utiliser SQLite pour des applications où les données ne sont pas centralisées et où l'expansion de la taille de la base ne risque pas de devenir critique. Si la base de données a pour but de centralier une grande masse de données et de les fournir à un grand nombre de clients, il est préférable d'utiliser une SGBD basés sur le paradigme client-serveur tel que MySQL. Néanmoins, les principes d'utilisation restent les mêmes. Dès lors, tout ce que vous apprendrez dans cette section avec SQLite sera transposable sans modification si vous devez plus tard travailler avec le module MySQLdb de Python permettant de se connecter à une base MySQL.
Comme vous vous y attendez certainement, l'accès aux fonctionnalités de SQLite est rendu possible grâce à l'importation d'un module:
Il faut ensuite décider le nom de fichier que vous voulez attribuer à la base de données. SQLite mémorise toutes les tables d’une base de données dans un seul fichier multi-plateformes que vous pouvez sauvegarder où vous voulez:
Le nom de fichier peut comporter un chemin et une extension quelconques. Il n'y a en effet pas d'extension propre aux fichiers de base de données SQLite mais il est courant de rencontrer des extensions comme .sqlite, .db ou .sq3. Il est également possible d’utiliser le nom spécial :memory:, ce qui indiquera au système de traiter la base de données en mémoire vive seulement. Ainsi les temps d’accès aux données seront raccourcis, et l’application pourra être ultra-rapide, ce qui peut vous intéresser dans le contexte d’un logiciel de jeu, par exemple, à la condition de prévoir un mécanisme distinct pour les sauvegardes sur disque.
Vous créez alors un objet-connexion, à l’aide de la fonction-constructeur connect(). Cet objet assurera l’interface entre votre programme et la base de données. L’opération est tout à fait comparable à l’ouverture d’un simple fichier texte, l’instanciation de l’objet créant le fichier de mémorisation au passage (s’il n’existe pas déjà) :
L’objet-connexion est désormais en place, et vous allez pouvoir dialoguer avec lui à l’aide du langage SQL. Il serait possible de le faire directement à l’aide de certaines méthodes de cet objet, mais il est préférable de mettre en place pour ce dialogue, encore un autre objet-interface que l’on appelle un curseur. Il s’agit d’une sorte de tampon mémoire intermédiaire, destiné à mémoriser temporairement les données en cours de traitement, ainsi que les opérations que vous effectuez sur elles, avant leur transfert définitif dans la base de données. Cette technique permet donc d’annuler si nécessaire une ou plusieurs opérations qui se seraient révélées inadéquates, et de revenir en arrière dans le traitement, sans que la base de données n’en soit affectée.
Une fois la connexion établie et le curseur créé, il est possible d'adresser des requêtes SQL au moteur de base de données SQLite par l'intermédiaire du curseur.
La requête est exprimée dans une chaîne de caractères classique, que nous transmettons au curseur par l’intermédiaire de sa méthode execute(). Rappelons au passage que le langage SQL ne tient aucun compte de la casse des caractères : vous pouvez donc encoder vos requêtes SQL indifféremment en majuscules ou en minuscules. Nous avons personnellement choisi d’écrire en majuscules les instructions de ce langage, afin de bien marquer la différence avec les instructions Python environnantes, mais vous pouvez bien évidemment adopter d’autres habitudes.
Nous rappelons également que les types de données ne portent pas les mêmes noms en Python et en SQL. La traduction ne devrait cependant pas vous tracasser outre mesure. Signalons simplement que les chaînes de caractères seront encodées par défaut en Utf-8, suivant en cela la même convention que celle pour les fichiers texte.
Nous pouvons maintenant entrer des enregistrements dans la base de données comme nous l'avions précédemment fait avec PHPMyAdmin:
A ce stade des opérations, les enregistrements sont dans le tampon du curseur, mais ils n’ont pas encore été transférés véritablement dans la base de données. Vous pourriez donc annuler tout, si nécessaire. Le transfert dans la base de données sera déclenché par la méthode commit() de l’objet connexion :
Le curseur peut alors être refermé, de même que la connexion, si le travail est terminé :