Développeur Drupal – Blog d'un passionné, un peu touche à tout, dans le monde du web.
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 !
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.
25 Responses to Utiliser plusieurs bases de données pour un site Drupal
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 !
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
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 ?
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
ApolloNet
juillet 7th, 2010 at 15 h 35 min
ça peut aussi être utile lors d’une migration.
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
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
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.
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 ?
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.
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.
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!!!
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 !
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.
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
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!
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
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/
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 !
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
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,
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.
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.
Nicolas
octobre 28th, 2011 at 17 h 00 min
Bonjour,
Merci Julien pour cet article, juste l’info que je recherchais, parfait !
Nicolas
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 :
Tu trouvera plus d’information ici : http://drupal.org/node/310071