Gestion de bases de données (MySQL, PostgreSQL, SQLite) sous Mac OS X ===================================================================== Christophe Lalanne Mars 2008 :Date: 09 mars 2008 :Revision: 1.1 :Revision history: Ce document est une mise à jour d'un ensemble de notes rédigées fin 2006, lors de l'acquisition de mon premier Mac (OS X), après 5 annnées passées sous Linux. Évidemment, tout est souvent plus simple sous Mac, en particulier la gestion du serveur Apache, des différents langages d'interface pour le web (PHP, Perl, Python, Ruby), et la mise en production de bases de données relationnelles. Plusieurs tutoriels sont disponibles sur le site http://developer.apple.com/opensource/[developer.apple.com/opensource/]. Toutefois, il s'agit vraiment d'une synthèse des notes que j'ai consignées durant l'installation des différents outils d'administration de bases de données, et il existe de bien meilleurs tutoriels ou documents de référence, sur le web et en librairie. MySQL ----- Configuration des droits ~~~~~~~~~~~~~~~~~~~~~~~~ .Remarque ****************************************************************************** Les différentes étapes de configuration décrites dans cette section suppose une installation manuelle du serveur sur un système Linux. Pour Mac OS X, la procédure de gestion des processus est largement simplifiée dans la mesure où la configuration est faite lors de l'installation et un utilitaire de démarrage automatique ou manuel est installé par défaut. ****************************************************************************** Après avoir installé http://www.mysql.com/[MySQL], il est nécessaire de configurer la table des droits d'accès. En effet, MySQL repose sur un principe d'accès restreint qui permet de contrôler quel(s) utilisateur(s) peut accéder à quelles bases, et quelles commandes il peut exécuter sur celles-ci (+SELECT+, +DROP+, etc.). Avant toute utilisation de MySQL, on s'assurera au préalable d'avoir bien lancé le démon, généralement +mysqld+. footnote:[Par défaut, sous Linux, on peut utiliser les scripts +Sys V+, +/etc/rc.d/mysql start+.] Dans un premier temps, il faut créer un (ou plusieurs) utilisateur(s) ; pour cela, on se connecte en _root_ sur la table +mysql+, qui contient la table des droits : ------------------------------------------------------------------------------ $ mysql -u root mysql -p ------------------------------------------------------------------------------ et on s'alloue tous les droits (ce n'est pas forcément une bonne idée, mais ça suffit pour tester les fonctionnalités de MySQL) : ------------------------------------------------------------------------------ GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'%' IDENTIFIED BY 'mot_de_passe' WITH GRANT OPTION; ------------------------------------------------------------------------------ où +utilisateur+ et +mot_de_passe+ sont bien évidemment à remplacer par les valeurs souhaitées. On notera que l'on utilisera +%+ pour inclure n'importe quel domaine pour la connexion. Le cas échéant, il faut spécifier +localhost+ (lorsqu'on n'est pas connecté à un réseau) et le nom d'hôte renvoyé par ------------------------------------------------------------------------------ $ hostname ------------------------------------------------------------------------------ Dans la commande +sql+ décrite plus haut, on a donné tous les privilèges à l'utilisateur +utilisateur+. Pour rendre effectives les modifications, il faut en plus taper ------------------------------------------------------------------------------ FLUSH PRIVILEGES; ------------------------------------------------------------------------------ En effet, pour améliorer la rapidité, MySQL dispose d'une copie de la base de données +mysql+ en mémoire, et celle-ci est actualisée par la commande +FLUSH PRIVILEGES+. On peut ensuite vérifier que le compte +utilisateur+ est présent dans la table des droits (on travaille toujours sous l'identité _root_) : ------------------------------------------------------------------------------ SELECT user, host, password FROM user; ------------------------------------------------------------------------------ On peut ensuite quitter la ligne de commande avec +quit;+ et se reconnecter sous l'identifiant nouvellement crée : ------------------------------------------------------------------------------ $ mysql -u chl -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 to server version: 5.0.26-max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> ------------------------------------------------------------------------------ Création d'une base de test ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cas général ^^^^^^^^^^^ En premier lieu, il est nécessaire de créer une nouvelle base, avec la commande : ------------------------------------------------------------------------------ CREATE DATABASE my_test; ------------------------------------------------------------------------------ On pourra vérifier que la base a bien été créer en tapant ------------------------------------------------------------------------------ mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | my_test | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) ------------------------------------------------------------------------------ Notons que l'on pourrait utiliser la base +test+ puisque celle-ci est fournie par défaut lors de l'installation (cf. note ci-dessous). Puis on indique que l'on travaille sur celle-ci (les nouvelles commandes `sql` s'appliqueront désormais sur la base +my_test+) : [TIP] .À propos des connexions sur des tables SQL ============================================================================== Par défaut également, les connexions anonymes sont autorisées et n'importe qui peut agir sur cette base de test. En fait, toutes les bases débutant par +test+ sont accessibles aux utilisateurs. On peut préférer une autre solution qui consiste à permettre à chaque utilisateur de créer sa propre base, en la préfixant par son nom d'utilisateur, e.g. +dupont_unebase+. Pour cela, on ne peut pas utiliser directement +GRANT+, car celle-ci n'autorise pas la saisie de caractères génériques, et on est obligé de jongler un peu : ------------------------------------------------------------------------------ USE my_test; GRANT USAGE ON *.* TO username@localhost IDENTIFIED BY 'xxx'; INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, Reference_priv, Index_priv, Index_prov, Alter_priv, Create_tmp_table_priv, Lock_tables_priv, Create_view_priv, Show_view_priv) VALUES ('localhost', 'username%', 'username', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'); FLUSH PRIVILEGES; ------------------------------------------------------------------------------ On effectue ainsi les modifications nécessaires directement dans la base +db+, et les noms de bases de données autorisés sont constitués de +username+ suivi de n'importe quel nombre de caractères (cf. le joker +%+). La première commande (+GRANT+...) sert à créer les utilisateurs si besoin. ============================================================================== On peut ensuite créer notre première table, par exemple une table incluant un identifiant unique, automatiquement attribué, un score et une date de saisie. ------------------------------------------------------------------------------ CREATE TABLE une_table ( id INT NOT NULL AUTO_INCREMENT, choice TINYINT NOT NULL, ts TIMESTAMP, PRIMARY KEY (id)); ------------------------------------------------------------------------------ On notera que l'on a définit la clé primaire sur le champ +id+, et que les champs +id+ et +choice+ doivent obligatoirement être renseignés (attribut +NOT NULL+). Ensuite, on peut commencer à alimenter la base avec des données : ------------------------------------------------------------------------------ INSERT INTO une_table (choice) VALUES (3); INSERT INTO une_table (choice) VALUES (5); ------------------------------------------------------------------------------ On peut vérifier l'état de la base avec la construction classique +SELECT ... FROM ...+ : ------------------------------------------------------------------------------ SELECT COUNT(choice) FROM une_table; +---------------+ | COUNT(choice) | +---------------+ | 2 | +---------------+ 1 row in set (0.00 sec) ------------------------------------------------------------------------------ Le résultat indique le nombre d'enregistrements présents dans la table +une_table+ (dans le cas présent, 2 enregistrements). Plutôt que de remplir manuellement la base avec la clause +INSERT+, on peut charger directement un fichier texte contenant les valeurs à ajouter. De même, on peut créer le tableau de données à l'aide d'un tableur, puis exporter la feuille de données au format txt (ou csv), en spécifiant un séparateur (tabulation ou +;+). Pour charger les données dans la table, il suffira de taper : ------------------------------------------------------------------------------ LOAD DATA INFILE '~/un_fichier.txt' INTO TABLE une_table FIELDS OPTIONALLY ENCLOSED BY '"'; ------------------------------------------------------------------------------ On se rappelera que la tabulation est le séparateur de données par défaut sous MySQL. Si le fichier texte utilise le +;+ comme séparateur de données, il faut le préciser lors de l'appel. Si tout se passe bien, on a le message suivant : ------------------------------------------------------------------------------ Query OK, 8 rows affected (0.00 sec) Records: 8 Deleted: 0 Skipped: 0 Warnings: 0 ------------------------------------------------------------------------------ On a bien rajouté 8 enregistrements provenant du fichier, et on peut vérifier que la table comporte à présent 10 enregistrements (les 2 crées manuellement + les 8 importés) : ------------------------------------------------------------------------------ SELECT COUNT(choice) FROM une_table; +---------------+ | COUNT(choice) | +---------------+ | 10 | +---------------+ 1 row in set (0.00 sec) ------------------------------------------------------------------------------ Pour un script d'importation automatique en PHP, voir http://www.infres.enst.fr/~danzart/mysql/mysqlimporte.phtml Outils SQL sous Mac OS X ^^^^^^^^^^^^^^^^^^^^^^^^ Les mêmes instructions, à l'exception de la gestion des scripts dans +/etc+, sont sous environnement Mac OS X. Après tout, c'est l'interaction avec un shell SQL qui a été présentée (certes très succinctement). Sous Mac OS X, il existe des applicatifs qui ``facilitent'' la gestion des bases de données (maintenance, requêtes, etc.). Mentionnons en deux : - http://cocoamysql.sourceforge.net/[CocoaMySQL] - http://dev.mysql.com/downloads/gui-tools/5.0.html[MySQL GUI Tools] *CocoaMySQL* est une application permettant de gérer des bases de données MySQL locales ou en ligne (création, suppression, modification, requêtes, sauvegardes). Voici à quoi ressemble l'interface générale (ici, connectée à une simple base de données) : *MySQL GUI Tools*, proposé sur le site http://dev.mysql.com/[mysql] est un ensemble de trois applications : - MySQL Administrator - MySQL Query Browser - MySQL Migration Toolkit Les figures suivantes illustrent la gestion du serveur <>, ainsi que des tables <> (*MySQL Administrator*). [[Fig. 1]] .Gestionnaire d'administration des bases SQL. image::MySQL_Administrator1_75pc.png[MySQL_Administrator1_75pc.png] [[Fig. 2]] .Gestionnaire d'administration des bases SQL. image::MySQL_Administrator2_75pc.png[MySQL_Administrator2_75pc.png] Dans la pratique, j'utilise assez rarement ces utilitaires puisque je construis mes tables dans des fichiers que je ``source'' directement dans le shell SQL. Quant aux requêtes, je les effectue généralement directement en ligne de commande ou à partir d'un script dans un autre langage (R, par exemple). Effectuer des requêtes (notions basiques) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ À présent, on peut effectuer des requêtes sur la base pour tester les fonctionnalités de +mysql+. Langage de requêtes et exemples ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [red]#Cette partie est à écrire...# Interfaces graphiques sous Mac OS X ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Nous avons mentionné dans la section précédente l'existence d'utilitaires graphiques. Outre l'interface de gestion du serveur +mysql+, les outils proposés par http://dev.mysql.com/[mysql] incluent un utilitaire de requête. À l'aide de celui-ci, on peut formuler une requête et visualiser le résultat dans des fenêtres organisées par onglets <>. Ici, on a simplement effectué une requête de type +SELECT * FROM Fiche+ (dans une base appelée, +tcf+). La clé primaire est indiquée par un carré dans la colonne correspondante (ici, +idFiche+). Le nombre de tuples retournés est indiqué dans la partie basse de l'interface. [[Fig. 3]] .Résultat d'une requête dans *MySQL Query Browser*. image::MySQL_QueryBrowser1_75pc.png[MySQL_QueryBrowser1_75pc.png] La palette d'outils proposée sur une barre latérale <> est assez commode puisqu'elle contient tous les éléments du langage SQL et propose une vue des schémas de la base. [[Fig. 4]] .Panneau latéral de *MySQL Query Browser*. image::MySQL_QueryBrowser2_75pc.png[MySQL_QueryBrowser2_75pc.png] Interfacer SQL avec d'autres langages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MySQL et R ^^^^^^^^^^ On peut également utiliser *R* pour interroger notre base. Il y a alors deux solutions : - soit on dispose d'un fichier texte dans lequel se trouve les données de la base (on aura au préalable exporté celle-ci), - soit on veut travailler directement en se connectant sur le serveur MySQL. Dans le premier cas, il suffit de charger le fichier avec +read.csv()+ : ------------------------------------------------------------------------------ > a <- read.csv("une_table.csv", header=T) ------------------------------------------------------------------------------ Dans le second cas, on a besoin du paquetage +RODBC+. ------------------------------------------------------------------------------ > install.packages('RODBC') ------------------------------------------------------------------------------ // TODO: revoir cette partie avec ODBC Le package +RMySQL+ permet de travailler directement avec une base de données MySQL. La procédure est assez simple puisqu'il suffit de définir un descripteur pour la connexion (il faut naturellement que le serveur soit démarré) : ------------------------------------------------------------------------------ > library(RMySQL) > link <- dbConnect(MySQL(), user="******", password="******", dbname="tcf", host="localhost") > dbListTables(link) ------------------------------------------------------------------------------ Pour effectuer des requêtes, on utilise la fonction +dbSendQuery()+, par exemple : ------------------------------------------------------------------------------ > result <- dbSendQuery(link, "SELECT * FROM Correcteur") ------------------------------------------------------------------------------ L'ensemble des résultats est à présent contenu dans la variable +result+. Pour afficher le résultat, on utilise la fonction +fetch()+ qui prend en argument la variable précédente. ------------------------------------------------------------------------------ > fetch(result, n=10) ------------------------------------------------------------------------------ MySQL et Perl ^^^^^^^^^^^^^ Pour utiliser l'interface Perl/MySQL, il faut installer le module DBI et +DBD::mysql+. On peut utiliser l'interface +cpan+ : ------------------------------------------------------------------------------ > sudo perl -MCPAN -e 'install Bundle::DBD::mysql' ------------------------------------------------------------------------------ [CAUTION] .Problème rencontré sous MacOS X ============================================================================== Par défaut, Perl s'attend à trouver la librairie (statique) +libmysqlclient.15.dylib+ dans le répertoire +/usr/local/mysql/lib/mysql/+, or il semble que depuis les dernières versions de MySQL, celle-ci soit installée dans le répertoire +/usr/local/mysql/lib/+. On peut imaginer recréer des liens symboliques pour faire correspondre ces deux répertoires, mais il existe une méthode plus simple de mise à jour du système de référencement des librairies sous MacOS X : la commande +install_name_tool+. Voici ce qu'il faut faire (en _root_) : ------------------------------------------------------------------------------ $ sudo install_name_tool -change $ /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib $ /usr/local/mysql/lib/libmysqlclient.15.dylib $ /Users/chl/.cpan/build/DBD-mysql-4.005/blib/arch/auto/DBD/mysql/mysql.bundle ------------------------------------------------------------------------------ Cette remarque vaut également pour la configuration de http://www.rubyonrails.org/[Rails]. ============================================================================== Avec Perl, il est nécessaire de définir, comme pour R, le serveur, le nom de la base, et les informations de connexion (nom d'utilisateur et mot de passe). ------------------------------------------------------------------------------ my $link = DBI->connect("dbi:mysql:$db:$server", $user, $pwd); ------------------------------------------------------------------------------ On forme ensuite la requête sql et on l'exécute : ------------------------------------------------------------------------------ my $query = "show tables"; my $sql = $link->prepare($query); $sql->execute(); ------------------------------------------------------------------------------ Pour récupérer et afficher les résultats, on peut utiliser une boucle formulée comme suit : ------------------------------------------------------------------------------ while (my $row = $sql->fetchrow_arrayref) { print join("\t", @$row), "\n"; } ------------------------------------------------------------------------------ On n'oubliera pas de refermer la connexion une fois les requêtes effectuées. ------------------------------------------------------------------------------ $link->disconnect; ------------------------------------------------------------------------------ MySQL et Python ^^^^^^^^^^^^^^^ Enfin, on peut également préférer le langage http://www.python.org/[Python] pour la manipulation et l'interrogation de la base MySQL. Il est nécessaire dans ce cas d'installer le package +mysql+ pour Python. Sous MacOS X, on peut le trouver sur le site http://sourceforge.net/projects/mysql-python/[sourceforge.net/projects/mysql-python/]. Pour compiler, il suffit de taper : ------------------------------------------------------------------------------ $ python setup.py build ------------------------------------------------------------------------------ puis en root : ------------------------------------------------------------------------------ $ sudo python setup.py install ------------------------------------------------------------------------------ On peut tester l'installation en tentant de se connecter à une base et en affichant les résultats du requête +SELECT+. ------------------------------------------------------------------------------ >>> import MySQLdb; >>> link = MySQLdb.connect('localhost','user','pwd','dbName') >>> curs = link.cursor() >>> result = curs.execute("select * from Correcteur") >>> result=curs.fetchall() >>> print result; >>> curs.close() >>> link.close() ------------------------------------------------------------------------------ PostgreSQL ---------- Le site officiel http://www.postgresql.org/[www.postgresql.org] comprend toutes les ressources nécessaires pour une transition ``en douceur'' de MySQL à PostgreSQL. Je n'ai jamais testé PostgreSQL sur Linux (encore moins sur Windows, mais là n'est pas le propos). Installation de PostgreSQL sur Mac OS X ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On peut installer +postgresql+ d'au moins 3 façons différentes sous Mac : - à partir des sources, disponibles sur le site de http://www.postgresql.org/download/[postgresql] - avec +fink+ (http://www.finkproject.org/[www.finkproject.org/]) - avec un package "intégré" disponible sur le site http://www.postgresqlformac.com/[www.postgresqlformac.com/] J'ai personnellement essayé les deux dernières solutions, et la dernière m'apparaît plus stable et souple à la fois. Si toutefois l'installation est effectuée via +fink+, on veillera à prendre la version la plus récente : ------------------------------------------------------------------------------ $ fink info postgresql Information about 6717 packages read in 2 seconds. postgresql-8.2.6-1: Upgrade package for PostgreSQL . Web site: http://www.postgresql.org/ . Maintainer: Benjamin Reed ------------------------------------------------------------------------------ Si l'on choisit la http://www.postgresqlformac.com/[dernière solution], il faut savoir que la suite serveur + outils d'administration est installée dans le répertoire +/Applications/PostgreSQL+ ainsi que des scripts d'initialisation dans +/Library/StartupItems/PostgreSQL+. Dans ce cas, le serveur +postgresql+ est lancé automatiquement lors de la connexion, ce qui n'est pas nécessairement ce que l'on souhaiterait. On peut supprimer le dossier en question dans le répertoire +/Library/StartupItems/+ (ou modifier le fichier +PostgreSQL+, mais je ne sais pas où est initialisée la variable +$POSTGRES$+...) et lancer ``à la main'' le serveur. Pour cela, on utilisera les commandes suivantes : ------------------------------------------------------------------------------ $ sudo -u postgres /Library/PostgreSQL8/bin/pg_ctl -D /Library/PostgreSQL8/data/ -l /Library/PostgreSQL8/log/PostgreSQL8.log start ------------------------------------------------------------------------------ En ce qui me concerne, le serveur est lancé au démarrage de la machine. Seul le serveur MySQL est démarré manuellement. Ensuite, on peut se connecter à la console +postgresql+ de la manière usuelle. ------------------------------------------------------------------------------ $ cd /Library/PostgreSQL8/bin/ $ ./psql test -U postgres test=# \d; List of relations Schema | Name | Type | Owner --------+----------------+----------+---------- public | foo | table | postgres public | foo_foo_id_seq | sequence | postgres (2 rows) ------------------------------------------------------------------------------ Configuration de PostgreSQL ~~~~~~~~~~~~~~~~~~~~~~~~~~ Si l'on a choisit de lancer le serveur au démarrage de Mac OS X (+/Library/StartupItems/PostgreSQL/PostgreSQL+), il n'est pas besoin de lancer manuellement le serveur. On peut vérifier que le serveur est bien démarré dans le *Moniteur d'activité*, ou en ligne de commande : ------------------------------------------------------------------------------ $ ps ax | grep postgres 165 ?? S 0:00.41 /Library/PostgreSQL8/bin/postgres -D /Library/Postgre 207 ?? Ss 0:00.40 postgres: writer process 208 ?? Ss 0:00.28 postgres: wal writer process 209 ?? Ss 0:00.08 postgres: autovacuum launcher process 210 ?? Ss 0:00.15 postgres: stats collector process 563 ?? Ss 0:00.01 postgres: postgres test ::1(49277) idle 564 ?? Ss 0:03.62 postgres: postgres test ::1(49278) idle 665 p2 R+ 0:00.00 grep postgres ------------------------------------------------------------------------------ Si l'on a installé les gestionnaires clients, on peut également lancer l'utilitaire *Service Manager* <>. Celui-ci est comparable à l'outil pour lancer le serveur +mysql+ situé dans le panneau des *Préférences Système* de Mac OS X : on clique sur le bouton pour démarrer... [[Fig. 1]] .Gestionnaire de connexion au serveur. image::pgsql1.png[pgsql1.png] Dans un premier temps, on crée une nouvelle base, que l'on appelera +test+ et qui nous servira de base de test. Ensuite, on se connecte à la nouvelle table ainsi crée et on ajoute deux entrées. On procède comme dans le http://developer.apple.com/internet/opensource/postgres.html[tutoriel en ligne] proposé par Apple. ------------------------------------------------------------------------------ [13] $ sudo -u postgres createdb test [14] $ sudo -u postgres psql test Welcome to psql 8.3.0, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit test=# create table tab1 (name varchar primary key, tab1_id serial); NOTICE: CREATE TABLE will create implicit sequence "tab1_tab1_id_seq" for serial column "tab1.tab1_id" NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tab1_pkey" for table "tab1" CREATE TABLE test=# insert into tab1 (name) values ('Alice'); INSERT 0 1 test=# insert into tab1 (name) values ('John'); INSERT 0 1 test=# \q ------------------------------------------------------------------------------ On peut effectuer des requêtes en ligne de commande, ou à l'aide des utilitaires graphiques. Par exemple, l'utilitaire *Query Tool for Postgres* permet de visualiser les tables, les schémas, etc. [[Fig. 2]] .Création d'une requête. image::pgsql2.png[pgsql2.png] En sélectionnant la table créée (+tab1+) <>, on peut afficher la liste des entrées (+SELECT * FROM tab1+) et on retrouve bien les deux entrées insérées à l'étape précédente <>. [[Fig. 3]] .Affichage des résultats. image::pgsql3_75pc.png[pgsql3.png] Ensuite, on peut ajouter un groupe d'utilisateurs autorisés à se connecter sur la table +test+. Ici, on ajoute l'utilisateur +chl+ avec le mot de passe +lolita+. Cela servira pour les connexions distantes sur la base de données. ------------------------------------------------------------------------------ test=# create group test; CREATE ROLE test=# create user chl with password 'lolita'; CREATE ROLE test=# alter group test add user chl; ALTER ROLE test=# \q ------------------------------------------------------------------------------ On peut vérifier que l'utilisateur nouvellement créé est bien autorisé à se connecter sur la table +test+. ------------------------------------------------------------------------------ $ psql test chl Welcome to psql 8.3.0, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit test=> \dp Access privileges for database "test" Schema | Name | Type | Access privileges --------+------------------+----------+------------------- public | tab1 | table | public | tab1_tab1_id_seq | sequence | (2 rows) ------------------------------------------------------------------------------ Le script Perl ci-dessous est entièrement copié du tutoriel proposé par Apple. Globalement, il permet de se connecter à la table et d'afficher l'ensemble des entrées qu'elle contient. Il est nécessaire d'installer l'interface +DBI.pm+ (comme pour MySQL), soit par +fink+ ------------------------------------------------------------------------------ $ sudo fink install dbi-pm ------------------------------------------------------------------------------ soit directement à partir de +CPAN+. Ensuite, on ajoute l'interface spécifique à PostgreSQL, +DBD::Pg+, à partir de +CPAN+. Donc, autant faire les deux avec l'utilitaire +cpan+. ------------------------------------------------------------------------------ $ sudo perl -MCPAN -e 'install DBI' $ sudo perl -MCPAN -e 'install DBD::Pg' ------------------------------------------------------------------------------ Le programme +cgi+ de test doit être placé dans le répertoire hébergeant les scripts CGI (sur un site distant, ou en local dans +/Library/WebServer/CGI-Executables+), et il doit être exécutable (+$ chmod +x pg.cgi+). .............................................................................. include::pg.cgi[tabsize=4] .............................................................................. Le résultat produit est conforme à ce qui est attendu <>. [[Fig. 4]] .Perl et PostgreSQL. image::pgsql4.png[pgsql4.png] SQLite ------ Du point de vue des http://www.sqlite.org/speed.html[performances], SQLite est préférable lorsque l'on gère de petites bases de données, sans grosses contraintes d'intégrité à mettre en place. Qui plus est, on peut accéder à des données stockées sous SQLite depuis pratiquement n'importe quel langage de programmation. Un http://www.sqlite.org/sqlite.html[tutoriel] permet de se familiariser rapidement avec SQLite. [TIP] .SQLite et Apple Mail ============================================================================== SQLite est installé par défaut sous Mac OS X (+sqlite3+). Le gestionnaire de mail *Apple Mail* utilise en fait une base de données SQLite pour gérer les messages. Comme cela est proposé sur le blog de http://www.hawkwings.net/2007/03/01/a-faster-way-to-speed-up-mailapp/[Hawk Wings], on peut ``accélérer'' l'affichage de *Apple Mail* (quelque peu ralenti lorsque l'on gère beaucoup de messages) en reconstruisant l'index de la table. Les commandes à utiliser sont assez simples : ------------------------------------------------------------------------------ $ cd ~/Library/Mail $ sqlite3 Envelope\ Index SQLite version 3.1.3 Enter ".help" for instructions sqlite> vacuum subjects; Ctrl-D ------------------------------------------------------------------------------ Personnellement, je conserve environ 2000 messages dans la boîte de récéeption de *Apple Mail*, et j'archive régulièrement les messages (tous les deux mois) dans des dossiers indexés chronologiquement, donc ce type de manipulation ne change pas foncièrement la réactivité de *Apple Mail*. ============================================================================== La création d'une base de données avec SQLite est beaucoup plus rapide qu'avec MySQL ou PostgreSQL puisqu'il y a beaucoup moins de droits à configurer. If faut donc plutôt voir SQLite comme un gestionnaire de fichier ``amélioré''. Par exemple, pour créer le même type de table qu'à la section précédente, on procède ainsi : ------------------------------------------------------------------------------ $ sqlite3 test.db SQLite version 3.1.3 Enter ".help" for instructions sqlite> create table tab2(one varchar(10), two smallint); sqlite> insert into tab2 values('Alice', 1); sqlite> insert into tab2 values('John', 2); sqlite> select * from tab2; Alice|1 John|2 ------------------------------------------------------------------------------ J'ai reproduit l'http://www.sqlite.org/quickstart.html[exemple tcl] fourni sur le site, en adaptant le chemin de la bibliothèque (l. 6, +load /usr/lib/tclsqlite3.so Sqlite3+) pour que cela corresponde à mon arborescence Mac. .............................................................................. include::query_tab2.sh[tabsize=4] .............................................................................. L'appel à ce petit programme produit le résultat escompté : ------------------------------------------------------------------------------ $ ./query_tab2.sh test.db "select * from tab2;" one = Alice two = 1 one = John two = 2 ------------------------------------------------------------------------------ Pour utiliser SQLite avec Ruby, il est nécessaire d'installer l'extension correspondante. On peut utiliser +gem+ pour cela. ------------------------------------------------------------------------------ $ sudo gem install sqlite3-ruby Password: Need to update 16 gems from http://gems.rubyforge.org ................ complete Select which gem to install for your platform (i686-darwin) 1. sqlite3-ruby 1.2.1 (mswin32) 2. sqlite3-ruby 1.2.1 (ruby) 3. sqlite3-ruby 1.2.0 (mswin32) 4. sqlite3-ruby 1.2.0 (ruby) 5. Skip this gem 6. Cancel installation > 2 Building native extensions. This could take a while... Successfully installed sqlite3-ruby-1.2.1 Installing ri documentation for sqlite3-ruby-1.2.1... Installing RDoc documentation for sqlite3-ruby-1.2.1... ------------------------------------------------------------------------------ Il existe une http://sqlite-ruby.rubyforge.org/sqlite3/faq.html[FAQ] pour les principales questions relatives à l'interface Ruby/SQLite. En ligne de commande, voici comment on peut procéder : ------------------------------------------------------------------------------ $ irb irb(main):001:0> require 'sqlite3' => true irb(main):002:0> db = SQLite3::Database.open( "test.db" ) => #, @statement_factory=SQLite3::Statement, @results_as_hash=false, @handle=#, @transaction_active=false, @closed=false, @translator=nil, @type_translation=false> irb(main):003:0> db.execute( "SELECT * FROM tab2" ) do |row| irb(main):004:1* puts row irb(main):005:1> end Alice 1 John 2 => nil ------------------------------------------------------------------------------ Voici également un petit script qui permet de récupérer les informations contenues dans la table +tab2+ créée ci-dessus. .............................................................................. include::sqlite_test.rb[tabsize=4] ..............................................................................