Comment définir et utiliser une connexion de base de données externe dans un module personnalisé

10

Je développe un module qui s'appuiera fortement sur les requêtes de bases de données externes. Existe-t-il une meilleure pratique pour définir et utiliser une connexion de base de données externe dans un module?

Cette page me dit comment faire la connexion, mais pas où la mettre dans un module (hook spécifique?) Donc je n'ai à la définir qu'une seule fois. De plus, est-il toujours nécessaire de faire "db_set_active ('YourDatabaseKey');" ou puis-je passer un argument qui définira la base de données à utiliser? J'utilise Drupal 7.

Whisky
la source
Si vous utilisez différents types de bases de données, vous aurez besoin du module DBTNG
Sivaji
Merci pour la suggestion, mais ce module n'est nécessaire que si vous utilisez Drupal 6. J'utilise Drupal 7.
Whisky

Réponses:

10

Il n'y a pas de place particulière pour mettre ce code (hook ou module), il vous suffit de le mettre là où vous en avez besoin.
Il devrait donc aller juste avant vos requêtes sur l'autre base de données et juste après pour réinitialiser la base de données par défaut.

Si tout votre module dépendra de la base de données externe, mettez-le simplement au début de la première fonction appelée pour votre module et à la fin de la dernière fonction.

Bien sûr, chacune de vos fonctions doit être exécutée sur la base de données externe et rien ne doit avoir à interroger la base de données par défaut sans revenir en arrière.

Ce code suivant échouerait:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

$node = node_load(123); //This would fail on the external DB.

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

Vous devez basculer d'avant en arrière:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 
$node = node_load(123); //Query made on the default Drupal DB.
db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 
tostinni
la source
2
Merci pour l'explication. J'ai fini par créer une fonction distincte qui sélectionne ma base de données externe avec db_set_active et si cela échoue, il ajoute la configuration de la base de données et essaie à nouveau. De cette façon, je peux l'utiliser dans les différents hooks avant d'exécuter des requêtes externes, mais j'ai besoin de réactiver la valeur par défaut comme vous l'avez souligné.
Whisky
4

Vous devrez ajouter dans settings.phpsitué à /sites/default/dans la syntaxe suivante

// Drupal 6

$db_url['default'] = 'mysql://db_user:password@localhost/db_name';
$db_url['external'] = 'mysql://db_user2:password@localhost/db_name2';

// Drupal 7

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'db1',
      'username' => 'user1',
      'password' => 'pass',
      'host' => 'host1',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
  'extra' =>
  array (
    'default' =>
    array (
      'database' => 'db2',
      'username' => 'user2',
      'password' => 'pass',
      'host' => 'host2',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Et après ces paramètres, vous pouvez utiliser db_set_active () pour basculer entre les bases de données.

Shoaib Nawaz
la source
Merci, vous pouvez le faire de cette façon, mais j'ai choisi de le faire à partir de mon module comme décrit sur la page à laquelle j'ai lié dans la question. De cette façon, vous pouvez demander aux utilisateurs admin de remplir leur propre configuration sur un formulaire de configuration administrateur.
Whisky