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 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

Après avoir installé 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.
[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;

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 :

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 mysql est un ensemble de trois applications :

Les figures suivantes illustrent la gestion du serveur [Fig. 1], ainsi que des tables [Fig. 2] (MySQL Administrator).

MySQL_Administrator1_75pc.png
Figure: Gestionnaire d'administration des bases SQL.
MySQL_Administrator2_75pc.png
Figure: Gestionnaire d'administration des bases SQL.

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

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 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 [Fig. 3]. 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.

MySQL_QueryBrowser1_75pc.png
Figure: Résultat d'une requête dans MySQL Query Browser.

La palette d'outils proposée sur une barre latérale [Fig. 4] est assez commode puisqu'elle contient tous les éléments du langage SQL et propose une vue des schémas de la base.

MySQL_QueryBrowser2_75pc.png
Figure: Panneau latéral de MySQL Query Browser.

Interfacer SQL avec d'autres langages

MySQL et R

On peut également utiliser R pour interroger notre base. Il y a alors deux solutions :

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')

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 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 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 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 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 :

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 <postgresql82@fink.racoonfink.com>

Si l'on choisit la 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 [Fig. 1]. 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…

pgsql1.png
Figure: Gestionnaire de connexion au serveur.

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 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.

pgsql2.png
Figure: Création d'une requête.

En sélectionnant la table créée (tab1) [Fig. 2], 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].

pgsql3.png
Figure: Affichage des résultats.

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).

#!/usr/bin/perl

use DBI;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use strict;

my $c = new CGI();
my $dbname = 'test';
my $user = 'postgres';
my $pass = 'lolita';

print $c->header();
print $c->start_html("Reading names from table 'tab1' in db 'test'");

my $dbh = DBI->connect("dbi:Pg:dbname=$dbname", $user, $pass) or die DBI::errstr;

my $res = $dbh->selectall_arrayref("select name from tab1");

for my $row (@$res)
{
    print 'Name: ' , @$row[0] , '<br>';
}

$dbh->disconnect();

print $c->end_html();

Le résultat produit est conforme à ce qui est attendu [Fig. 4].

pgsql4.png
Figure: Perl et PostgreSQL.

SQLite

Du point de vue des 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 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 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'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.

#!/usr/bin/tclsh
if {$argc!=2} {
  puts stderr "Usage: %s DATABASE SQL-STATEMENT"
  exit 1
}
load /usr/lib/sqlite3/libtclsqlite3.dylib Sqlite3
sqlite3 db [lindex $argv 0]
db eval [lindex $argv 1] x {
  foreach v $x(*) {
    puts "$v = $x($v)"
  }
  puts ""
}
db close

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 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" )
=> #<SQLite3::Database:0x10249cc @driver=#<SQLite3::Driver::Native::Driver:0x101b73c @callback_data={}, @trace={}, @busy_handler={}, @authorizer={}>, @statement_factory=SQLite3::Statement, @results_as_hash=false, @handle=#<SWIG::TYPE_p_sqlite3:0x101b6b0>, @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.

#!/usr/bin/env ruby

require 'rubygems'
gem 'sqlite3-ruby'

db = SQLite3::Database.new( "test.db" )

db.execute( "SELECT * FROM tab2" ) do |row|
  puts row
end

db.close