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.

Merci à Frédéric !

25 Responses to Utiliser plusieurs bases de données pour un site Drupal

Avatar

Marie-Hélène

juin 30th, 2010 at 11 h 50 min

Je ne comprends pas très bien l’intérêt d’usage de cette technique par rapport à un multisite avec un site qui pointe vers ‘drupal’, un autre vers ‘anotherdb’, et ainsi de suite. Parce que sauf erreur, Drupal ne peut utiliser (pour son propre fonctionnement s’entend, je ne parle pas d’une intégration d’une autre application) qu’une seule base de données *à la fois*. Peux-tu préciser quels genres de cas peuvent justifier cette solution plutôt qu’une autre ?

Merci !

Avatar

Julien

juin 30th, 2010 at 13 h 02 min

Bonjour Marie-Hélène

Non ici il ne s’agit pas de multi site mais simplement de permettre à Drupal d’utiliser des informations stockées dans une autre base de données que la sienne.
Par exemple, tu peux avoir ton intranet en Drupal et un applicatif métier avec sa propre base. Si tu as envie que ton Drupal puisse avoir accès aux informations de ton applicatifs tu n’auras pas d’autre choix que de faire cela, c’est à dire permettre à Drupal de changer de base pour des requêtes précises.

J’espère avoir été assez clair :)

Avatar

Marie-Hélène

juillet 1st, 2010 at 15 h 54 min

euh.. « un applicatif métier » … sous-titres ?

tu veux dire que sur les bases « anotherdb » et « yetanotherdb » ce n’est pas drupal qui est installé, en fait ?

Avatar

Hello / Sector One

juillet 4th, 2010 at 9 h 29 min

Bonjour

Cool, très bonne idée, surtout pour la sécurité

@Marie Helene : Moi je vais m’en servir pour communiquer avec différents sites qui sont réalisés avec différents CMS. comme ceci, je peux tout centraliser.

Christophe

Avatar

ApolloNet

juillet 7th, 2010 at 15 h 35 min

ça peut aussi être utile lors d’une migration.

Avatar

linda

juillet 15th, 2010 at 9 h 43 min

Je suis novice dans l’utilisation de Drupal et j’aurais apprécié de connaître le nom du fichier dans lequel se fait l’appel à la fonction db_set_active(); car pour le moment je n’ai pas trouvé…Merci

Avatar

Julien

juillet 15th, 2010 at 10 h 03 min

Bonjour Linda

La fonction db_set_active($name) se trouve dans le fichier includes/databases.inc

Avatar

linda

juillet 15th, 2010 at 10 h 24 min

Bonjour Julien,

Merci pour ta réponse, j ai bien trouvé la fonction dans includes/databases.inc mais je ne parviens pas à ouvrir ma Base SQL sous Drupal même après avoir changé l’appel à db_set_active($name); dans le fichier install.php pour la connexion à la Base de données.
Donc, je me demande où je place les lignes suivantes:
db_set_active(’second’);
2
3 db_query(‘SELECT * FROM table_in_anotherdb’);
4
5 //Retour sur la table défaut une fois terminée.
6 db_set_active(‘default’);

Merci pour ton aide.

Avatar

Julien

juillet 16th, 2010 at 9 h 38 min

Hello Linda

Oula il ne faut pas modifier les fichiers sources de Drupal comme cela :)

En faite tu dois créer ton propre module et y placer les lignes suivantes qui vont utiliser les fonctions du fichier databases.inc.

Est ce que tu peux m’en dire plus sur ton besoin et ce que tu chercher à faire histoire de t’aider un peu plus ?

Avatar

linda

juillet 16th, 2010 at 10 h 09 min

Bonjour Julien,

J’avais fini par comprendre. En fait, je dois créer un site web sous Drupal à partir d’une base de données externe à Drupal. J’ai un peu jouer avec les fonctionnalités du cms et j’ai trouvé le module panels qui me permet de mettre en forme assez aisément mes pages et mes blocs. J’avoue que j’ai du mal à comprendre comment je peux faire le lien entre les fonctionnalités de la base Drupal et une base de données SQL externe qui contient les contenus à afficher. Je ne suis pas certaine d’avoir été très claire mais si tu peux éclairer ma lanterne, j’avoue que je serais ravie.
Merci beaucoup à toi.

Avatar

Julien

juillet 19th, 2010 at 8 h 50 min

Il me faudrait en savoir plus sur le genre d’informations que tu veux récupérer et ce que tu veux en faire.

Par contre ton Drupal et ton autre base sont bien du même type ? Car il n’est pas possible de changer de driver de base de données. Si ton Drupal utilise du mysql ton autre base devra être aussi en mysql.

Avatar

linda

juillet 20th, 2010 at 13 h 25 min

Bonjour Julien,

En fait je suis actuellement en stage pour un laboratoire de recherche qui devra passer son site web sous Drupal et je suis chargée de rédiger une étude de faisabilité. Je dois donc comprendre comment me connecter à une base de données externe à Drupal qui est celle du laboratoire afin d’afficher sur les pages du site web les données du personnel, des équipes, des publications, etc…Mais j’avoue que j’éprouve d’énormes difficultés à comprendre comment afficher mes pages d infos de la base externe du mm type que celle de Drupal, j ai bien vérifié. Au secours, Drupal me rend folle!!!

Avatar

Anthony

juillet 21st, 2010 at 11 h 28 min

Linda, je te conseille de regarder du côté du développement de module pour Drupal.
Si tu ne connais pas grand chose au PHP et MySQL ça te prendra un peu de temps, mais tu avancera beaucoup plus vite sur ton projet.

Pour apprendre à développer un module je te conseille http://www.kolossaldrupal.org/ qui explique très bien les étapes à suivre dans la création de module.

Une fois cet apprentissage fini, tu pourra utiliser le code qu’a fourni Julien afin de pouvoir te connecter à ta base de données externe à ton installation Drupal.

Bon courage !

Avatar

linda

juillet 22nd, 2010 at 8 h 08 min

Bonjour Anthony et merci.
J’ai déjà visité le site que tu me conseilles et après de multiples récidives, j’ai finalement réussi à faire fonctionner un module bloc!!!
Youpi!
Bon bah c’est pas rien, maintenant il me faut créer un module viewsPerso pour obtenir ce dont j ai besoin.
Merci beaucoup de votre précieuse aide.

Avatar

Julien

juillet 22nd, 2010 at 8 h 46 min

Oui y’a de bonnes infos sur Kolossaldrupal

Si tu es sur Paris on organise une rencontre entre drupaleur le 27 juillet à 18h30
au Le Saint Georges Tavern – 46 rue du faubourg Montmartre, Paris 75009.

Si tu veux tu peux venir ca sera plus facile pour répondre à ton problème :)

Avatar

linda

juillet 22nd, 2010 at 11 h 06 min

Merci pour ton invitation Julien. Je ne suis hélas pas sur Paris mais j’avoue que je cherche bien vite une solution pour pouvoir répondre présente!

Avatar

linda

juillet 22nd, 2010 at 13 h 55 min

Une autre question pour continuer d’avancer, j’espère que vous aurez une solution.
Je dois faire différents affichages pour les mettre dans des contenus de panels(ex:par équipe, par fonction…). J’avais pour ça créer un type de contenu pour lequel existait une vue sur laquelle je pratiquais des affichages afin de les disposer dans les contenus. Je ne sais pas si je suis très claire là. Le mieux pour moi serait-il de créer un module de type de contenu par table de ma bd ou d’aller toucher à view pour qu il aille chercher les infos sur ma base externe???? Help! Merci

Avatar

ssm2017

septembre 28th, 2010 at 21 h 56 min

j’ai joue un peu avec db_set_active au printemps et je m’en sers encore car obligation.
qu’ais je pu remarquer ?

- Damz m’a dit que c’est fait pour utiliser des bases et des tables de drupal core uniquement, ca marche pour le reste mais c’est pas recommandé (ca marche mieux avec drupal7)
- il faut revenir le plus rapidement possible a la base par defaut des que possible quitte a relancer db_set_active juste pour une requete.
- c’est pas cool avec les prefixes de table car ils sont communs, on ne peut pas avoir des prefixes differents sur une table et sur l’autre a moins de bidouiller (je me suis fabrique une fonction db_set_active perso pour ca).
- attention a certains modules qui utilisent db_rewrite_sql qui a du mal avec db_set_active

pour voir des exemples de ce que j’ai fait avec :
ligne 63
http://github.com/ssm2017/d4os/blob/d6-os0.6.8/io/d4os_io_db/d4os_io_db.module
ou pour le reste du module :
http://github.com/ssm2017/d4os/tree/d6-os0.6.8/io/d4os_io_db/

Avatar

Julien

septembre 30th, 2010 at 8 h 20 min

Je ne connaissais pas le coup des préfixes de tables, effectivement ca devient plus problématique. Je crois avoir lu qu’il n’était pas recommandé d’en mettre, mais je n’arrive pas à retrouver cet article.

Merci pour ces retours d’expériences ssm2017 !

Avatar

Benj

décembre 31st, 2010 at 13 h 26 min

Bonjour.

Merci pour l’info.

Penses tu que l’on puisse appliquer cette méthode directement dans les fichiers tpl.php de views?

Par exemple, « fabriquer » une view sur le site A, l’importer sur le site B et rajouter a ce moment là un db_set_active avant et après la requête directement dans un fichier de gabarit?

(Est ce que c’est assez clair?)

Merci d’avance et bon réveillon! :-)

Benj

Avatar

Zara

février 24th, 2011 at 11 h 02 min

Bonjour,

J’utilise drupal depuis un mois et j’avoue que je galère encore pas mal. J’ai crée des tables (qui doivent contenir les données que les utilisateurs importent sur le site) avec des préfixes différents dans la même base de données que drupal. Mais je ne sais pas maintenant comment faire travailler ces tables avec les tables par défaut de drupal et afficher les contenus de ces tables dans drupal. J’ai pensé utiliser « table wizard » mais est-ce la meilleure solution? ou il vaut mieux créer d’autre base de donnée dans la même base que drupal?

Merci de votre réponse!

Zara,

Avatar

Julien

mars 6th, 2011 at 11 h 52 min

@Benj il est important de garder la séparation entre le code et le templating, donc non, il ne faut pas faire d’appel à la base de données depuis un fichier de template. Je ne suis pas sûr du résultat que vous obtiendrez en créant une vue sur un site A et en l’important sur le site B, ça me parait compliqué, peu fiable et pas performant (temps de réponse des bdd). Il faudrait peut être essayer ce patch http://drupal.org/node/576694#comment-2523946 pour connecter views à d’autres tables non Drupal.

@Zara, Oui la route est longue pour maitriser Drupal :) Pour votre besoin il y a quelques solutions mais à chaque fois il va vous falloir coder, ça va donc dépendre de votre capacité à développer. Pour vos donner quelques idées il me faudrait savoir ce que vous avez besoin de faire de vos données.

Avatar

stéphane

octobre 26th, 2011 at 9 h 55 min

Bonjour à tous.
Je débute avec drupal et je suis actuellement en train de faire un appli intranet pour une entreprise. le sujet sur la connexion de drupal à plusieurs bases de données m’intéresse énormément. j’utilise la version D7 et dans default/setting.php je n’ai pas la ligne suivante dans le fichier : $db_url = ‘mysql://admin:pass@localhost/drupal’;
je ne peux donc pas effectuer les modifications indiquées par Julien. est-ce un problème de version ?
je ne peux pas apporter les modifications indiquées par julien sur la connexion à plusieurs bdd??
merci d’avance pour votre aide et pour ce lui de julien.

Avatar

Nicolas

octobre 28th, 2011 at 17 h 00 min

Bonjour,
Merci Julien pour cet article, juste l’info que je recherchais, parfait ! ;-)
Nicolas

Avatar

Julien

octobre 30th, 2011 at 10 h 50 min

@Stéphane, la gestion des bases de données entre D6 et D7 à complètement changée depuis l’arrivé de DBTNG qui permet de générer des requêtes quelque soit la base de données en face.

Maintenant pour connecter plusieurs bases à Drupal il faut faire ceci :

$databases['default']['default'] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb1',
  'username' => 'username',
  'password' => 'secret',
  'host' => 'dbserver1',
);
$databases['default']['slave'][] = array(
  'driver' => 'mysql',
  'database' => 'drupaldb2',
  'username' => 'username',
  'password' => 'secret',
  'host' => 'dbserver2',
);

Tu trouvera plus d’information ici : http://drupal.org/node/310071

Comment Form



About me

about me

Bienvenue sur mon blog. Sur cet espace j’essaie de partager au mieux ma passion pour le web et actuellement mon engouement pour Drupal. Vous trouverez ici mes découvertes, mes problématiques et les solutions rencontrées.

I am going to DrupalCon London!

Commentaires

  • opi: Merci pour l'article, spécialement l'astuce du parcours d'un repertoire 'views', à la recherches d [...]
  • Julien: Il faut reconnaître quand même un avantage à Features, c'est de réunir en un seul module la poss [...]
  • Netmee: Super article. Je partage ta vision sur le coté plus light de cette solution face à Features. D'un [...]
  • Pascal H: Bonjour, je viens de découvrir Drupal et, quelques lectures plus tard votre blog. Félicitation [...]
  • Gilles: Merci pour cet article très intéressant. Je m'intéresse à l'externalisation de la saisi pour fa [...]