|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Présentation SQLite est un système de gestion de bases de données relationnelles embarquées, libre et Open Source. Contrairement aux autres SGBDR, il n'est pas orienté "client-serveur", ses bases de données sont uniquement exploitées en local (idéal pour les logiciels devant embarquer la base de données, donc sans partage des données en réseau avec d'autres utilisateurs). Pour cela, il est également ultra-léger (< 1 Mo). Intégré à de nombreux logiciels grand public, produits professionnels, bibliothèques standards, langages de programmation, systèmes embarqués, smartphones et tablettes, SQLite est au final le moteur de bases de données le plus utilisé au monde. Une chance pour nous : la version AmigaOS/MorphOS (3.34.0 à ce jour) est aussi la dernière disponible, identique à la version Windows/Linux/macOS ! Étant spécialiste en bases de données et utilisateur de MorphOS, j'ai donc profité de la disponibilité de SQLite sur MorphOS pour approfondir ce SGBDR que je n'avais jamais utilisé. L'objectif de ce tutoriel est de vous apporter un cas concret d'exploitation de base de données relationnelle avec SQLite, mais pas d'enseigner en détail le langage SQL ni l'implémentation de SQLite dans une application logicielle. Cependant, il est présenté de sorte que le novice peut tout de même s'y retrouver et en comprendre la finalité. Enfin, l'environnement choisi est MorphOS mais l'utilisation de SQLite est logiquement la même sur AmigaOS ou tout autre système. Pour découvrir davantage SQLite : fr.wikipedia.org/wiki/SQLite. Site officiel : www.sqlite.org. Téléchargement L'archive de SQLite 3.34.0 (et suivantes) pour MorphOS est disponible sur www.morphos-storage.net/?find=sqlite. Après avoir téléchargé l'archive, la désarchiver et copier son dossier à l'endroit souhaité sur disque. Personnellement, j'ai renommé son dossier en "SQLite". Utilisation en lignes de commandes avec l'outil SQLite nommé "sqlite3" Ouvrir un terminal Shell, puis lancer l'outil SQLite - le tout en créant une nouvelle base de données - en tapant sur une seule ligne (avec un espace après "sqlite3" et attention à vos propres chemins) :
Sachant que chez moi l'outil "sqlite3" est dans "Work:Applications/SQLite/build-ppc-morphos/bin/" et que le fichier de la base de données créée s'appellera "Bibliotheque" dans "Work:Developpement/SQLite/BDD/". Une autre solution serait de copier "sqlite3" dans "C:", ce qui donnerait :
Puis dans l'outil SQLite, saisir l'ensemble des commandes suivantes (après l'invite de commande "sqlite> "), dans l'ordre précisé afin de suivre correctement ce tutoriel - pas à pas - jusqu'au bout. Commandes internes de base Voir l'ensemble des commandes internes intégrées à l'outil SQLite (le point en préfixe est obligatoire pour les commandes internes) :
Pour quitter l'outil SQLite :
Pour retourner dans SQLite et dans la base de données "Bibliotheque", retaper (chez moi) :
Ou avec "sqlite3" dans "C:" :
Dans SQLite, vérifier les bases de données utilisées :
Création de tables et clés primaires/clés étrangères Créer la nouvelle table "Auteurs" dans la base de données "Bibliotheque" (le point-virgule en fin d'instruction est obligatoire pour les requêtes SQL) :
Précision SQLite : avec ce genre de "primary key" sur une seule colonne de type entier (integer), sa valeur sera automatiquement incrémentée au fur et à mesure des insertions de lignes dans la table. Autre rappel : la clé primaire permet d'éviter les doublons de lignes dans la table mais aussi d'identifier une ligne de façon unique. Créer la nouvelle table "Livres" dans la base de données "Bibliotheque" :
Précision SQLite : la contrainte "foreign key" permet de relier la table "Livres" à la table "Auteurs" via les colonnes respectives "IdAuteur", celle-ci ne pouvant pas être rajoutée ultérieurement avec un "alter table" (comme dans d'autres SGBDR). Autre rappel : une clé étrangère permet de contrôler que les données d'une (ou plusieurs) colonne(s) de table correspondent bien aux données de la clé primaire d'une autre table (de référence). Ici, chaque livre de la table "Livres" doit être affecté à un auteur existant dans la table "Auteurs". Activer le contrôle des clés étrangères (sinon inactif) :
Attention : à réactiver à chaque nouvelle utilisation de la base de données (accès à SQLite) ! Vérifier les tables créées (dans la base de données courante "Bibliotheque") :
Revoir le schéma ("create table") des tables existantes :
Insertion de données Insérer des lignes de données dans la table "Auteurs" :
Interroger toute la table "Auteurs" :
Résultat :
Rappel : une "*" affiche toutes les colonnes et un "select" sans condition "where" retourne toutes les lignes. Insérer des lignes de données dans la table "Livres" :
Interroger toute la table "Livres" :
Résultat :
Interrogation de tables avec tri Avec tri selon la colonne "Parution" :
Résultat :
Précision : "asc" pour ascendant et "desc" pour descendant. Nombre de lignes des tables Afficher le nombre de lignes des tables :
Contrôle des clés étrangères Essayer d'insérer un livre dont l'auteur n'existe pas (violation de clé étrangère) :
Résultat :
Essayer de supprimer un auteur affecté à des livres (violation de clé étrangère) :
Résultat :
Interrogation de tables avec jointure Interroger plusieurs tables reliées avec jointure (liaison entre clé étrangère et clé primaire, en général mais pas obligatoirement) :
Résultat (liste des livres avec leur auteur et leur date de parution) :
Création et utilisation de vues Créer la nouvelle vue "LivresAuteurs" (table image résultant d'un "select" interrogeant une ou plusieurs tables) :
Résultat :
Rappel : une fois créée, une vue s'utilise comme une table mais sans contenir de données. Exemple d'utilisation de la vue "LivresAuteurs" :
Résultat :
Rappel : une vue allège les syntaxes et optimise les traitements des requêtes SQL complexes. Autre exemple d'utilisation de la vue "LivresAuteurs" :
Résultat :
Interrogation de tables avec regroupement Afficher le nombre de livres par auteur (avec regroupement par nom) :
Résultat :
Attention, pas la même chose que :
(résultat erroné ou ambigu) Autre exemple de regroupement (avec condition "having") :
Résultat :
Avec alias "as Total" pour "count(*)" :
Même résultat :
Interrogation de tables avec union de sélections Afficher le résultat de plusieurs "select" à la suite (union de sélections) :
Résultat :
Précisions : les "select" doivent retourner le même nombre de colonnes. "all" conserve les lignes en doublon. Utilisation de fonctions d'agrégat Utiliser des fonctions d'agrégat (retournent une valeur unique à partir d'un ensemble de valeurs) : Pour rappel :
Comptage :
Minimum :
Maximum :
Somme :
Moyenne :
Précisions : les fonctions d'agrégat ne tiennent pas compte des valeurs vides (null), sauf le count(*). "count", "min" et "max" fonctionnent également sur les valeurs alphanumériques (textes). Modification de données Modifier un enregistrement dans une table :
Vérifier :
Résultat :
Attention : un "update" sans condition "where" modifie toutes les lignes de la table ! Valeurs vide et non vide Rechercher des valeurs de colonne à vide (null) ou non vide (not null) :
Suppression de données Supprimer un enregistrement dans une table :
Vérifier :
Résultat :
Attention : un "delete" sans condition "where" supprime toutes les lignes de la table ! Utilisation de transactions Utiliser une transaction (pour éventuellement annuler les modifications avec un "rollback;") : Démarrer la transaction :
Effectuer des modifications, par exemple vider la table "Livres" :
Annuler les modifications (et quitter la transaction) :
Vérifier :
Résultat :
Précision : un "commit;" à la place du "rollback;" aurait enregistré les modifications (et quitté la transaction). Création et utilisation de triggers Créer un trigger/déclencheur sur la table "Auteurs" (programme s'exécutant automatiquement lorsqu'un évènement insert/update/delete survient sur la table associée) :
Résultat :
Précision : "old" fait référence à la table "Auteurs" avant suppression ("before delete"). Exemple d'utilisation du trigger "suppr_auteur_et_livres" (lorsqu'un auteur est supprimé dans la table "Auteurs", ses livres sont aussi automatiquement supprimés dans la table "Livres") :
Résultats :
Exportation et importation de données Exporter toutes les données de la table "Livres" dans le fichier "RAM:Livres.csv" :
Vérifier (en utilisant la commande interne ".system" d'appel de commandes système depuis SQLite) :
Résultat :
Réimporter toutes les données du fichier "RAM:Livres.csv" dans la table "Livres" (à vider au préalable) :
Résultat :
Sauvegarde et restauration de bases de données (et destruction de tables/vues/triggers) Faire la sauvegarde complète (backup) de la base de données "Bibliotheque" dans le fichier "RAM:Bibliotheque.bak" :
Vérifier :
Précision SQLite : cette sauvegarde (et sa restauration) peut être également réalisée en copiant simplement le fichier sur disque de la base de données. Détruire les trigger, vue et tables créés :
Vérifier :
Faire la restauration complète (restore) de la base de données "Bibliotheque" depuis le fichier "RAM:Bibliotheque.bak" :
Vérifier :
Sauvegarde SQL de bases de données Faire la sauvegarde SQL complète (dump) de la base de données "Bibliotheque" dans le fichier "RAM:Bibliotheque.sql" (notamment pour une migration vers un autre SGBDR) :
Vérifier (dans le terminal Shell) :
Le mot de la fin Vous voilà venu à bout de ce tutoriel qui vous a introduit l'essentiel des fonctionnalités d'exploitation d'une base de données relationnelle avec SQLite. Un SGBDR digne de ce nom, qui dispose d'un langage SQL riche et relativement standard. En définitive une excellente solution pour gérer les données dans le développement de vos logiciels sur MorphOS (et AmigaOS) !
|