Vous est-il déjà arrivé de devoir exporter des données d'une base à une autre? Entre deux bases gérées par le même serveur, c'est facile. Entre deux bases gérées par deux instances différentes du même SGBD-R (Système de Gestion de Bases de Données Relationnelles) , c'est faisable. Mais en environnement hétérogène, c'est une autre histoire! Et la solution consiste souvent à installer spécifiquement un outil de gestion multi-base – voire à écrire en vitesse un utilitaire pour effectuer le transfert.

Or, depuis sa version 10.6, ij, l'interface en ligne de commande d'Apache Derby, permet d'effectuer de tels transferts en quelques lignes de script. Et cela entre n'importe quelles bases compatibles avec JDBC! C'est ce que nous allons voir maintenant.

Pré-requis

Je suppose ici que vous avez téléchargé et installé une version de Derby ≥ 10.6. Je suppose aussi que vous avez convenablement installé le pilote JDBC correspondant à la base étrangère à laquelle vous voulez vous connecter.

Note:

Ici, je vais prendre l'exemple d'une copie de MySQL vers Derby. Mais comprenez bien que n'importe quelle base compatible JDBC peut être utilisée. Aussi bien en source qu'en destination:

  • MySQL → Derby,
  • Derby → MySQL,
  • PostgreSQL → MySQL,
  • Oracle → PostgreSQL,
  • ...

La procédure

Sans plus tarder, voyons comment précéder. Pour cet exemple, je vais copier le contenu de la table SourceTable de la base MySQL SourceDB vers la table DestTable de la base Derby DestDB. Les commentaires expliquent ligne par ligne les opérations effectuées:

# Si ce n'est déjà fait, ajouter le pilote JDBC MySQL dans le CLASSPATH
sh$ export CLASSPATH="$CLASSPATH:/path/to/mysql-connector-java.jar"
sh$ java org.apache.derby.tools.ij
ij version 10.6

-- Tout d'abord, on se connecte à la source de données
ij> CONNECT 'jdbc:mysql://localhost/SourceDB?user=sylvain&password=mot-de-passe'
>           AS SourceConn;
-- Et on prépare la requête SourceStmt qui sélectionnera les données à importer
ij> PREPARE SourceStmt AS 'SELECT a, b FROM SourceTable';

-- Maintenant, on se connecte à la destination
ij> CONNECT 'jdbc:derby:DestDB'
>           AS DestConn;
-- À partir d'ici, ij a deux connexions ouvertes simultanément

-- Avant de faire le transfert, il faut désactiver l'autocommit
ij(DESTCONN)> AUTOCOMMIT OFF;
-- Reste à effectuer un INSERT dans la connexion courante en utilisant
-- les données récupérées par la requête SourceStmt@SourceConn
ij(DESTCONN)> EXECUTE 'INSERT INTO DestTable(c,d) VALUES (?, ?)' USING SourceStmt@SourceConn;
1 row inserted/updated/deleted
1 row inserted/updated/deleted
1 row inserted/updated/deleted
[...]
-- C'est fini: Reste à confirmer la transaction
ij(DESTCONN)> COMMIT;

-- Et à supprimer la requête source qui ne nous servira plus
ij(DESTCONN)> REMOVE  SourceStmt@SourceConn;
-- On peut quitter ij
ij(DESTCONN)> DISCONNECT SourceConn;
ij> DISCONNECT DestConn;
ij> EXIT;
ij permet d'ouvrir simultanément plusieurs connexions vers des serveurs de bases de données. Le prompt indique la connexion courante.

Quelques remarques pèle-mêle: