Como definir e usar uma conexão de banco de dados externo em um módulo personalizado

10

Estou desenvolvendo um módulo que depende muito de consultas externas ao banco de dados. Existe uma prática recomendada para definir e usar uma conexão de banco de dados externo ao longo de um módulo?

Esta página me diz como fazer a conexão, mas não onde colocá-la em um módulo (gancho específico?); Portanto, só preciso defini-la uma vez. Além disso, é sempre necessário fazer "db_set_active ('YourDatabaseKey');" ou posso passar um argumento que definirá o db para usar? Estou usando o Drupal 7.

Uísque
fonte
Se você estiver usando diferentes tipos de bancos de dados que você precisa DBTNG módulo
Sivaji
Obrigado pela sugestão, mas esse módulo só é necessária se você estiver usando o Drupal 6. Estou usando Drupal 7.
Whiskey

Respostas:

10

Não há um lugar específico para colocar esse código (gancho ou módulo), basta colocá-lo onde for necessário.
Portanto, ele deve ocorrer antes das suas consultas no outro banco de dados e logo depois para restaurar o banco de dados padrão.

Se todo o seu módulo depender do banco de dados externo, basta colocá-lo no início da primeira função chamada para o seu módulo e no final da última função.

É claro que todas as suas funções devem ser executadas no banco de dados externo e nada deve ter que consultar o banco de dados padrão sem voltar.

Este código a seguir falharia:

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

Você deve alternar entre eles:

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
fonte
2
Obrigada pelo esclarecimento. Acabei criando uma função separada que seleciona meu banco de dados externo com db_set_active e, se isso falhar, adiciona a configuração do banco de dados e tenta novamente. Dessa forma, eu posso usá-lo nos diferentes ganchos antes de executar consultas externas, mas preciso definir o padrão ativo novamente, como você apontou.
Whisky
4

Você terá que adicionar settings.phplocalizado /sites/default/na seguinte sintaxe

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

E após essas configurações, você pode usar db_set_active () para alternar entre bancos de dados.

Shoaib Nawaz
fonte
Obrigado, você pode fazê-lo desta maneira, mas optei por fazê-lo no meu módulo, conforme descrito na página à qual vinculei a pergunta. Dessa forma, você pode fazer com que os usuários administradores preencham suas próprias configurações em um formulário de configuração de administrador.
Uísque