Как определить и использовать подключение к внешней базе данных в пользовательском модуле

10

Я разрабатываю модуль, который будет сильно зависеть от запросов к внешней базе данных. Существует ли лучший способ определения и использования подключения к внешней базе данных в модуле?

На этой странице рассказывается, как установить соединение, но не где его разместить в модуле (конкретный хук?), Поэтому мне нужно определить его только один раз. Кроме того, всегда ли нужно делать "db_set_active ('YourDatabaseKey');" или я могу передать аргумент, который будет использовать БД? Я использую Drupal 7.

Виски
источник
Если вы используете разные типы баз данных, вам понадобится модуль DBTNG
Sivaji
Спасибо за предложение, но этот модуль необходим, только если вы используете Drupal 6. Я использую Drupal 7.
Виски

Ответы:

10

Нет конкретного места для размещения этого кода (хук или модуль), вы просто помещаете его туда, где вам нужно.
Так что он должен идти перед вашими запросами в другой базе данных и сразу после того, как установить обратно базу данных по умолчанию.

Если весь ваш модуль будет полагаться на внешнюю БД, просто поместите его в начало первой функции, вызываемой для вашего модуля, и в конец последней функции.

Конечно, каждая ваша функция должна выполняться на внешней БД, и ничто не должно запрашивать базу данных по умолчанию без обратного переключения.

Этот следующий код потерпит неудачу:

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

Вы должны переключаться назад и вперед:

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
источник
2
Спасибо за объяснение. Я закончил тем, что создал отдельную функцию, которая выбирает мою внешнюю базу данных с помощью db_set_active, и если это не удается, он добавляет конфигурацию базы данных и пытается снова. Таким образом, я могу использовать его в различных хуках перед выполнением внешних запросов, но мне нужно снова установить значение по умолчанию активным, как вы указали.
Виски
4

Вы должны будете добавить в settings.phpрасположенный /sites/default/в следующем синтаксисе

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

И после этих настроек вы можете использовать db_set_active () для переключения между базами данных.

Шоаиб Наваз
источник
Спасибо, вы можете сделать это таким образом, но я решил сделать это из моего модуля, как описано на странице, на которую я ссылался в этом вопросе. Таким образом, вы можете попросить администраторов заполнить свою конфигурацию в форме настроек администратора.
Виски