Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site
https://www.yesik.it !
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;
Quelques remarques pèle-mêle:
- Les seuls changements à apporter pour utiliser une autre base source ou destination se résument à changer l'URI dans la requête CONNECT;
- La requête source peut être un simple SELECT, comme ici, ou une requête arbitrairement complexe avec des jointures et des fonctions. Tout fera l'affaire, du moment que c'est une requête valide pour votre SGDB source;
- C'est la notation stmt@connexion qui permet d'indiquer lors de la requête EXECUTE que les données viennent d'une requête préparée dans une autre connexion.