Cómo definir y usar una conexión de base de datos externa en un módulo personalizado

10

Estoy desarrollando un módulo que dependerá en gran medida de las consultas de bases de datos externas. ¿Existe alguna práctica recomendada para definir y utilizar una conexión de base de datos externa en un módulo?

Esta página me dice cómo hacer la conexión, pero no dónde colocarla en un módulo (¿gancho específico?), Así que solo tengo que definirla una vez. Además, ¿siempre es necesario hacer "db_set_active ('YourDatabaseKey');" o puedo pasar un argumento que establecerá el db para usar? Estoy usando Drupal 7.

Whisky
fuente
Si está utilizando diferentes tipos de bases de datos, necesitaría un módulo DBTNG
Sivaji,
Gracias por la sugerencia, pero ese módulo solo es necesario si está usando Drupal 6. Estoy usando Drupal 7.
Whisky

Respuestas:

10

No hay un lugar en particular para colocar este código (gancho o módulo), simplemente póngalo donde lo necesite.
Por lo tanto, debe ir justo antes de sus consultas en la otra base de datos y justo después de restablecer la base de datos predeterminada.

Si todo su módulo se basará en la base de datos externa, simplemente colóquelo al comienzo de la primera función llamada para su módulo y al final de la última función.

Por supuesto, cada una de sus funciones debe ejecutarse en la base de datos externa y nada debe tener que consultar la base de datos predeterminada sin volver a cambiar.

El siguiente código fallaría:

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(); 

Debe cambiar de un lado a otro:

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
fuente
2
Gracias por la explicación. Terminé creando una función separada que selecciona mi db externo con db_set_active y si eso falla, agrega la configuración de db e intenta nuevamente. De esa forma, puedo usarlo en los diferentes enlaces antes de ejecutar consultas externas, pero necesito configurar el predeterminado activo nuevamente como usted señaló.
Whisky
4

Deberá agregar en settings.phpubicado /sites/default/en la siguiente sintaxis

// 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' => '',
    ),
  ),
);

Y después de esta configuración, puede usar db_set_active () para cambiar entre bases de datos.

Shoaib Nawaz
fuente
Gracias, puede hacerlo de esta manera, pero opté por hacerlo desde mi módulo como se describe en la página a la que hice el enlace en la pregunta. De esa manera, puede hacer que los usuarios administradores completen su propia configuración en un formulario de configuración de administrador.
Whisky