Utiliser plusieurs bases de données pour un site Drupal

Utiliser plusieurs bases de données pour un site Drupal

30 Jun 2010 |  Drupal

On m’a posé une question intéressante il y a quelques jours, à savoir comment faire pour accéder à une autre base de données que celle sur laquelle est installé Drupal. N’ayant jamais rencontré cette problématique je me suis penché sur cette question.

Le principe est simple, il suffit de renseigner les connexions vers les différentes bases de données et de switcher entre elles lorsque vous en avez besoin.

Par défaut Drupal sait quelle base utiliser grâce aux informations contenues dans le fichier default/settings.php.

Vous devriez avoir quelque chose qui ressemble à ça :

$db_url = 'mysql://admin:pass@localhost/drupal';

Afin de lui permettre d’utiliser d’autres bases de données nous allons modifier et ajouter dans ce fichier les informations de connexions nécessaires.

// Notre connexion par défaut
$db_url['default'] = 'mysql://admin:pass@localhost/drupal';
// Nos nouvelles connexions
$db_url['second'] = 'mysql://root:pwd@localhost/anotherdb';
$db_url['db3'] = 'mysql://user:pwd@localhost/yetanotherdb';

Pour utiliser une autre base de données il suffit simplement de l’activer avec la fonction db_set_active en passant le nom de votre connexion.

db_set_active('second');

db_query('SELECT * FROM table_in_anotherdb');

//Retour sur la table défaut une fois terminée.
db_set_active('default');

N’oubliez pas une fois terminé de revenir sur la base par défaut :)

Edit : Suite à la remarque de FGM il n’est pas possible d’inclure dans le fichier settings.php des connexions vers différents types de base de données. C’est à dire que vous ne pouvez pas avoir une connexion qui utilise le driver Mysql et le driver Pgsql.

Pour comprendre il faut regarder la fonction db_set_active() dans le fichier includes/databases.inc. C’est lors de l’appel à cette fonction qu’est chargé le driver souhaité. Imaginons que je charge en premier le driver mysql (includes/database.mysql.inc) et ensuite le driver pgsql (includes/database.pgsql.inc). Nous nous retrouvons à ce moment là avec deux fichiers chargés en mémoire contenant les mêmes noms de fonctions. Or il est impossible de redéclarer une fonction sans que cela ne génère une erreur php.

Julien Dubreuil

Vous avez une idée, un projet web à réaliser ?

Ensemble, mettons en oeuvre sa réussite. Je vous accompagne dans vos projets, depuis l'élaboration du cahier des charges jusqu'à la mise en production. Pour plus d'information n'hésitez pas à me contacter.

Contactez-moi