MySQL et Rebol/Command

Rebol/Command dispose d'un accès natif au SGBD MySQL. Ces deux produits permettent de mettre en place rapidement des solutions e-business efficaces. Si la connexion à une base de données et l'exécution de requêtes SQL sont des opérations aisées avec Rebol/Command, l'utilisation de MySQL est plus complexe et nécessite souvent la digestion d'un imposant manuel utilisateur. Le but de ce dossier est donc de vous rendre rapidement productif en vous expliquant les opérations essentielles pour la mise en place d'un projet utilisant MySQL et Rebol/Command. Dans un premier temps, vous aborderez donc l'installation du SGBD, la création d'une base de données et des utilisateurs. Vous pourrez ensuite utiliser Rebol/Command pour dialoguer avec la base de données.


  1. Installation de MySQL
  2. Dialoguer avec le SGBD
  3. La base système mysql
  4. Créer un utilisateur
  5. Lier un utilisateur à une base de données
  6. Fixer les droits sur une base
  7. Créer ou détruire une base de données
  8. Ajouter des tables
  9. Connexion à une base MySQL avec Rebol/Command
  10. Quelques trucs utiles pour formuler correctement les requêtes SQL
  11. Accéder au schéma de votre base ou de vos tables
  12. Conclusion

Installation de MySQL

La première étape consiste à installer MySQL sur un serveur Linux utilisant la distribution Red Hat 6.2. Vous devez récupérer cinq fichiers au format RPM :

Selon votre processeur et surtout le numéro de version de MySQL, les noms de ces fichiers peuvent varier. Pour des raisons de performances, optez pour le bon type de processeur : ne faites pas tourner la version x386 sur un Pentium III !

En étant utilisateur root, vous pouvez utiliser la commande rpm -i suivie du nom du fichier RPM que vous voulez installer. Une fois ceci terminé, vous avez théoriquement un serveur MySQL opérationnel. La commande pstree vous permet de vérifier la présence du daemon safe_mysqld et de ses fils nommés mysqld.

MySQL tourne sur le serveur Jupiter

Vous pouvez contrôler le lancement et l'arrêt de MySQL sur votre machine en utilisant la commande service de Linux. La syntaxe service mysql start permet de lancer MySQL alors que l'usage du paramètre stop met fin à son exécution.

Dialoguer avec le SGBD

MySQL ne dispose pas en standard d'une interface utilisateur conviviale. Le seul outil livré se nomme mysql et fonctionne sur le modèle de la ligne de commandes. Il vous permet d'utiliser certaines fonctions d'administration ainsi que d'exécuter des instructions SQL. Chaque ordre envoyé à MySQL doit être terminé par un ";".

L'interpréteur mysql peut recevoir de nombreux arguments à son démarrage. Vous allez ici vous connecter en tant qu'administrateur du SGBD (le root de MySQL et non pas le compte root de votre système Linux) à partir de la machine hébergeant le SGBD : mysql -h localhost -u root

L'administrateur de MySQL est connecté à l'aide de la console mysql

Pour l'instant, vous ne pouvez pas faire grand chose. En fait, vous pouvez créer une nouvelle base de données ou vous connecter à une base déjà existante. C'est cette seconde opération que vous allez réaliser maintenant en vous connectant à la base système nommée mysql. Pour cela, vous devez saisir dans la console l'ordre suivant : use mysql;

Si tout s'est bien passé, MySQL doit vous indiquer que la base de données a changé (Database changed). Toutes les opérations qui suivront seront appliquées à cette base considérée comme étant celle de travail.

La base système mysql

MySQL utilise une base système contenant toutes les informations nécessaires à son fonctionnement. Cela signifie que la configuration du SGBD est principalement réalisée par la manipulation de différentes tables à l'aide d'instructions SQL. L'instruction show tables vous permet d'afficher le contenu de cette base de données :

+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv    |
| db              |
| func            |
| host            |
| tables_priv     |
| user            |
+-----------------+

Tables contenues dans la base système mysql

En fait sur ces six tables, seulement trois sont vraiment utiles quotidiennement. La table db permet d'associer des utilisateurs aux bases de données. La table host permet de déterminer les droits appliqués à chacune de vos bases de données. La table user contient les utilisateurs déclarés ainsi que leurs droits. A l'aide de l'instruction describe suivie d'un nom de table, vous pouvez obtenir la description des champs de la table interrogée.

+-----------------+-----------------+------+-----+---------+-------+
| Field           | Type            | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host            | char(60) binary |      | PRI |         |       |
| Db              | char(64) binary |      | PRI |         |       |
| User            | char(16) binary |      | PRI |         |       |
| Select_priv     | enum('N','Y')   |      |     | N       |       |
| Insert_priv     | enum('N','Y')   |      |     | N       |       |
| Update_priv     | enum('N','Y')   |      |     | N       |       |
| Delete_priv     | enum('N','Y')   |      |     | N       |       |
| Create_priv     | enum('N','Y')   |      |     | N       |       |
| Drop_priv       | enum('N','Y')   |      |     | N       |       |
| Grant_priv      | enum('N','Y')   |      |     | N       |       |
| References_priv | enum('N','Y')   |      |     | N       |       |
| Index_priv      | enum('N','Y')   |      |     | N       |       |
| Alter_priv      | enum('N','Y')   |      |     | N       |       |
+-----------------+-----------------+------+-----+---------+-------+

Descriptif de la table db

+-----------------+-----------------+------+-----+---------+-------+
| Field           | Type            | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host            | char(60) binary |      | PRI |         |       |
| User            | char(16) binary |      | PRI |         |       |
| Password        | char(16) binary |      |     |         |       |
| Select_priv     | enum('N','Y')   |      |     | N       |       |
| Insert_priv     | enum('N','Y')   |      |     | N       |       |
| Update_priv     | enum('N','Y')   |      |     | N       |       |
| Delete_priv     | enum('N','Y')   |      |     | N       |       |
| Create_priv     | enum('N','Y')   |      |     | N       |       |
| Drop_priv       | enum('N','Y')   |      |     | N       |       |
| Reload_priv     | enum('N','Y')   |      |     | N       |       |
| Shutdown_priv   | enum('N','Y')   |      |     | N       |       |
| Process_priv    | enum('N','Y')   |      |     | N       |       |
| File_priv       | enum('N','Y')   |      |     | N       |       |
| Grant_priv      | enum('N','Y')   |      |     | N       |       |
| References_priv | enum('N','Y')   |      |     | N       |       |
| Index_priv      | enum('N','Y')   |      |     | N       |       |
| Alter_priv      | enum('N','Y')   |      |     | N       |       |
+-----------------+-----------------+------+-----+---------+-------+

Descriptif de la table user

+-----------------+-----------------+------+-----+---------+-------+
| Field           | Type            | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host            | char(60) binary |      | PRI |         |       |
| Db              | char(64) binary |      | PRI |         |       |
| Select_priv     | enum('N','Y')   |      |     | N       |       |
| Insert_priv     | enum('N','Y')   |      |     | N       |       |
| Update_priv     | enum('N','Y')   |      |     | N       |       |
| Delete_priv     | enum('N','Y')   |      |     | N       |       |
| Create_priv     | enum('N','Y')   |      |     | N       |       |
| Drop_priv       | enum('N','Y')   |      |     | N       |       |
| Grant_priv      | enum('N','Y')   |      |     | N       |       |
| References_priv | enum('N','Y')   |      |     | N       |       |
| Index_priv      | enum('N','Y')   |      |     | N       |       |
| Alter_priv      | enum('N','Y')   |      |     | N       |       |
+-----------------+-----------------+------+-----+---------+-------+

Descriptif de la table host

IMPORTANT

Les modifications sur les tables systèmes de MySQL ne sont prises en compte par le SGBD qu'à la suite de l'instruction flush privileges. Si cela n'est pas fait, votre configuration ne sera jamais activée !


Créer un utilisateur
L'ajout d'un utilisateur se fait par insertion de tuple. Les champs host, user et password de la table user contiennent respectivement la machine (adresse IP ou nom complet) ou la classe d'adresses à partir de laquelle l'utilisateur user peut se connecter. L'identité de l'utilisateur est vérifiée à l'aide du mot de passe qui est crypté dans la table à l'aide de l'instruction password(). Les différentes valeurs booléennes présentes dans la table permettent de préciser les droits de l'utilisateur (lecture, écriture, destruction ou construction d'une table, etc.) mais pour l'instant, vous n'avez pas à vous en soucier.

Exemple 1 : l'utilisateur "olivier" peut se connecter depuis la machine locale sur le serveur MySQL. Son mot de passe est "homer" :

INSERT INTO user (host,user,password) values ('localhost','olivier',password('homer'));

Exemple 2 : l'utilisatrice "nathalie" peut se connecter à partir de n'importe quelle machine du réseau 172.29.143.0. Son mot de passe est "maggy" :

INSERT INTO user (host,user,password) values ('172.29.143.%','nathalie',password('maggy'));

Dans les deux cas, vous devez valider votre modification à l'aide de l'instruction flush privileges.

Lier un utilisateur à une base de données

Vous devez insérer des informations dans la table db de la base mysql. Il vous est ici recommandé de fixer les droits des utilisateurs qui accèderont à la base afin d'éviter des destructions ou modifications involontaires d'informations. Le champ host contient ici le nom de la machine hébergeant le client MySQL (le caractère joker % permet de fixer une plage d'adressage telle que "172.29.143.%" ou d'autoriser l'utilisation d'une machine quelconque avec simplement "%"), le champs db contient le nom de la base et le champs user contient le nom de l'utilisateur (déclaré dans la table user) pouvant se connecter. Dix valeurs booléennes permettent de fixer les droits de chacun sur les informations contenues dans la base.

Exemple 1 : l'utilisateur "olivier" peut se connecter sur la base "fiches" avec un contrôle total sur la base (insertion, modification, effacement, etc.) :

INSERT INTO db values ('localhost','olivier','fiches','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

Exemple 2 : l'utilisatrice "nathalie" a le droit de se connecter sur la base "fiches" mais ne peut que consulter les informations contenues dans les tables :

INSERT INTO db (host,user,db,select_priv) values ('localhost','nathalie','fiches','Y');

Dans les deux cas, vous devez valider votre modification à l'aide de l'instruction flush privileges.

Fixer les droits sur une base

La table host permet de déterminer les machines ou réseaux (champs host) pouvant se connecter au serveur MySQL pour dialoguer avec une base de données (champs db). Vous avez également la possibilité de fixer des droits pour les utilisateurs de la base de données.

Créer ou détruire une base de données

A l'aide de la commande create database suivie du nom de la base, vous pouvez créer une nouvelle base de données.

Exemple : création de la base de donnée nommée "fiches" :

CREATE DATABASE fiches;

Une fois la base générée, vous devez utiliser l'instruction use de la commande de MySQL afin de sélectionner la nouvelle base et de débuter la création des tables qu'elle devra contenir.

Une base de donnée peut être détruite avec l'instruction drop. Cette opération est irrémédiable, la structure de la base et les données qu'elle contient étant définitivement détruites.

Exemple : destruction de la base "fiches" :

DROP database;

Ajouter des tables

Une table est créée à l'aide de l'instruction create table suivie du nom de la nouvelle table.

Exemple : construction de la table "personne" contenant une clé primaire numérique ("num") et deux champs contenant une chaîne de caractères ("nom" et "prenom") :
create table personne (

num SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

nom CHAR(40),

prenom CHAR(40),

PRIMARY KEY (num)

);

Vous pouvez saisir directement la description de la table dans la console mysql ou utiliser un fichier SQL contenant la description des tables de votre base de données. Celui ci vous permettra de reconstruire votre base en cas de perte et surtout de transporter le schéma de votre base d'une machine à une autre. L'instruction vous permettant de charger un script SQL est source suivie du nom du fichier.

TINYINT
DOUBLE
TIMESTAMP
BLOB
SMALLINT
DOUBLE PRECISION
TIME
TEXT
MEDIUMINT
REAL
YEAR
MEDIUMTEXT
INT
DECIMAL
CHAR
LONGBLOB
INTEGER
NUMERIC
VARCHAR
LONGTEXT
BIGINT
DATE
TINYBLOB
ENUM
FLOAT
DATETIME
TINYTEXT
SET

Les 28 types de données disponibles dans MySQL

Connexion à une base MySQL avec Rebol/Command

Pour se connecter à une base MySQL, vous avez besoin de quatre informations qui sont :

A partir du moment où vous disposez de ces renseignements, vous pouvez utiliser le protocole mysql intégré à Rebol/Command. La connexion à la base est réalisée avec le mot open, suivi d'une URL contenant les données relatives à l'identification et à la sélection du fournisseur de données. Le résultat de l'opération est un mot de type PORT! identifiant de façon unique la connexion.

Exemple : connexion à la base "fiches" sur la machine 172.29.143.1 pour l'utilisateur "olivier" ayant le mot de passe "homer" :

db: open mysql://olivier:homer@172.29.143.1/fiches

Vous pouvez maintenant demander à disposer d'un port pour le dialogue entre le poste client et le serveur MySQL. C'est ce port qui sera utilisé pour l'envoi de requêtes SQL et la lecture des données retournées par le serveur.

Exemple : récupération d'un port de dialogue

p: first db

Il ne vous reste plus qu'à insérer dans ce port votre requête SQL et à lire le résultat avec le mot copy. Le résultat obtenu est un bloc de blocs correspondants aux différentes lignes parcourues dans la base de données.

Exemple : lecture des enregistrements dans la table "personne" :

insert p {select * from personne}

print copy p

Une fois votre ou vos requêtes SQL traitées, vous devez fermer les deux ports utilisés par le protocole mysql. Il faut utiliser pour cela le mot close suivi du nom du port.

Exemple : fermeture des deux ports utilisés pour la base "fiches" :

close p

close db

Quelques trucs utiles pour formuler correctement les requêtes SQL

Lorsque vous écrivez une requête SQL, ayez le réflexe d'utiliser les accolades "{" et "}" pour entourer votre requête. Elles vous permettent d'utiliser sans crainte les double-guillemets pour délimiter les chaînes de caractères présentes dans la requête elle-même.

Pour les requêtes complexes, Rebol/Command dispose d'une fonction formidable : il s'agit du point d'interrogation. En fait, si les données insérées dans le port de dialogue sont un bloc, celui-ci contient une chaîne de caractères et un nombre quelconque de valeurs. La chaîne correspond à la requête et celle-ci peut contenir un ou plusieurs points d'interrogation. A l'exécution, Rebol/Command opère une substitution des "?" par les valeurs présentes dans le bloc. L'affectation est séquentielle et il doit bien sûr y avoir autant de "?" que de valeurs.

Exemple : recherche des personnes dont le prénom est "olivier" et le nom est "auverlot" dans la table "personne" de la base de donnée "fiches" :

db: open mysql://olivier:homer@172.29.143.1/fiches

p: first db

insert p [ {select * from personne where prenom=? and nom=?} "olivier" "auverlot" ]

print copy p

close p

close db

Accéder au schéma de votre base ou de vos tables

A l'aide d'un dialecte, vous pouvez demander au SGBD des renseignements sur la structure d'une base de données et sur les différentes tables qui la composent. Avec l'instruction 'tables, vous obtenez la liste des tables présentes dans la base.

Exemple : liste des tables dans la base "fiches" :

db: open mysql://olivier:homer@172.29.143.1/fiches

p: first db

insert p [ 'tables ]

print copy p

close p

close db

L'instruction 'columns suivie du nom d'une table retourne le descriptif de chaque champ contenu dans la table (nom, type, propriétés).

Exemple : affichage des champs constituant la table "personne" :

db: open mysql://olivier:homer@172.29.143.1/fiches

p: first db

insert p [ 'columns "personne" ]

print copy p

close p

close db

Les données sont formatées à l'aide de blocs, chaque bloc correspondant à un champ.

Conclusion

Vous voici au terme de ce dossier sur l'utilisation conjointe de MySQL et de Rebol/Command. Vous disposez maintenant de toutes les informations nécessaires à la mise en place rapide de projets utilisant ces deux produits. Merci de me signaler les inévitables erreurs ou oublis.

Olivier Auverlot

olivier.auverlot@free.fr

Retour