sqlite utilisation avec tcl

 

Manipulation d'une base de données SQLite en TCL.

---

Il faut rien ajouter à tcl pour faire fonctionner une BDD sqlite

Il faut inclure le package suivant :

 package require sqlite3

L'exemple suivant permet de créer une base de données de livre.

C'est un exemple volontairement simple, nom du livre et nom de l'auteur sur deux tables.

C'est uniquement pour comprendre la mise oeuvre de sqlite avec tcl.

Ouverture d'une base de données

 sqlite3 db1 biblio.db

Création des tables

 db1 eval {CREATE TABLE auteur (aut_id integer primary key, aut_auteur text)}

La table auteur contient un index a_id et le nom de l'auteur

 db1 eval {CREATE TABLE livre (liv_id integer primary key, liv_aut integer, liv_titre text)}

La table livre contient aussi un index liv_id, un titre liv_titre, et liv_aut contiendra l'index de l'auteur dans la table auteur.

Cela s'appelle une jointure et évite la redondance de données dans la base.

Ajout de données dans les tables

 db1 eval {INSERT INTO auteur (aut_id, aut_auteur) VALUES (1, "Pierre Bordage")}

 db1 eval {INSERT INTO auteur (aut_id, aut_auteur) VALUES (2, "Frédéric Fabri")}

 db1 eval {INSERT INTO auteur (aut_id, aut_auteur) VALUES (3, "Corentin")}

 db1 eval {INSERT INTO livre (liv_id, liv_aut, liv_titre) VALUES (1, 1, "Les derniers hommes")}

 db1 eval {INSERT INTO livre (liv_id, liv_aut, liv_titre) VALUES (2, 1, "La fraternité du Panca")}

 db1 eval {INSERT INTO livre (liv_id, liv_aut, liv_titre) VALUES (3, 2, "Cycle Beta")}

 db1 eval {INSERT INTO livre (liv_id, liv_aut, liv_titre) VALUES (4, 3, "Human Genome")}

Requêtes sur les données

Combien de livre dans la bibliothèque ?

 set nb [db1 eval {SELECT COUNT(liv_id) FROM livre}]

 puts "Nombre de livre dans la BDD : $nb"

Quelles sont les livres dans la bibliothèque ?

 db1 eval {SELECT liv_titre FROM livre} {
    puts $liv_titre
 }

Il y a eu création de la variable de même nom que la colonne sur la table.

Par exemple, les résultats seront dans les variables aut_id et aut_auteur, dans la requête suivante

 db1 eval {SELECT * FROM auteur} {
    puts "Id Auteur : $aut_id \n Auteur : $aut_auteur"
 }

Retourne une liste des livres avec leurs auteurs

 set tab [db1 eval {SELECT livre.liv_titre, auteur.aut_auteur from livre, auteur WHERE livre.liv_aut = auteur.aut_id}]

Combien d'éléments ont été retournés

 puts "Nb éléments : [llength $tab]"

L'élément n° 2, attention cela commence à 0

 puts "Un éléments particulier: [lindex $tab 2]"

Affiche le livre et l'auteur

 puts "Portion de liste : [lrange $tab 0 1]"

Affichage du titre du livre et auteur par ligne

 for {set i 0} { $i < [llength $tab]} {incr i 2} {
    puts "[lrange $tab $i $i] [lrange $tab $i+1 $i+1]"
 }

Retourne, sous forme d'un tableau, les livres écrits par Pierre Bordage

 db1 eval {SELECT liv_titre from livre, auteur WHERE livre.liv_aut = auteur.aut_id AND auteur.aut_auteur = "Pierre Bordage"} liste_livre {
    foreach nom [array names liste_livre] {
	   puts "Valeur associée à \"$nom\": $liste_livre($nom)
    }
 }

Injection d'un fichier csv sur la table livre.

Ici il y a remplacement des données, le séparateur est ;

 set rec [db1 copy replace livre monfichier.csv ";" "NULL"]

Fermeture de la base

 db1 close

Pour tester vos requête SQL

en direct sur votre base télécharger sqlite3 (voir liens utiles)

Ainsi à partir d'une fenêtre DOS vous pouvez passer des commandes vers votre base.

liens utiles

Présentation de sqlite sur ce wiki

http://wfr.tcl.tk/1255

Interface Tcl et Sqlite

http://www.sqlite.org/tclsqlite.html

Exemples tcl/sqlite (Wiki anglais)

http://wiki.tcl.tk/2633

http://wiki.tcl.tk/24739

Utilisation de sqlite3 en ligne de commande

http://www.newthinktank.com/2013/05/sqlite3-tutorial/