Несколько одновременных подключений к базе данных в drupal 7 - PullRequest
9 голосов
/ 29 января 2011

Я пишу класс-оболочку для моего сайта drupal 7, который позволяет мне подключаться и запрашивать базу данных phpbb.

При подключении к внешнему источнику данных (согласно документации на drupal) вы устанавливаете активную базу данных, запускаете запрос, а затем возвращаете активную базу данных по умолчанию.

, например

db_set_active('phpbb');
$result = db_query($sql,$args,$opts);                               
db_set_active();//back to default

Но есть ли способ использовать оболочку базы данных drupal для создания совершенно нового соединения, которое можно постоянно устанавливать на новую базу данных без необходимости переключаться туда-сюда? несомненно, мы можем обрабатывать подключения к нескольким базам данных одновременно.

Я немного погуглил, но пока не нашел никого, кто бы пытался это сделать.

Ответы [ 3 ]

12 голосов
/ 29 января 2011

Типичный.Через 5 минут после публикации я выясняю это ... так что для будущих гуглеров:

По сути, вы не используете db_query, вместо этого вы запускаете запрос для своего соединения без установки активной ссылки.

Вы можете понять это, посмотрев, как работает db_query: http://api.drupal.org/api/drupal/includes--database--database.inc/function/db_query/7

Так это выглядит так:

$target='default';
$key = 'phpbb';
$phpbb = Database::getConnection($target,$key);
$result = $phpbb->query($sql,$args,$opts);

Предполагается, что в вашем файле settings.php настроена база данных.как следующее:

$databases['phpbb']['default'] = array(
    'driver' => 'mysql',
    'database' => 'forum',
    'username' => 'username',
    'password' => 'password',
    'host' => 'mysql.host.com',
    'prefix' => 'phpbb3_'
);
1 голос
/ 20 июня 2013

Database :: addConnectionInfo () возможно?

Этот метод позволяет добавлять новые учетные данные подключения во время выполнения.В нормальных условиях предпочтительным способом указания учетных данных базы данных является файл settings.php.Однако этот метод позволяет добавлять их в произвольное время, например, во время модульных тестов, при подключении к сторонним базам данных, определенным администратором, и т. Д.

Если данная пара ключ / целевой объект уже существует, этот методбыть проигнорированным.

0 голосов
/ 08 июня 2014

Определение для getConnection ссылается на другой порядок аргументов, чем использованный выше.

function getConnection($target = 'default', $key = NULL)

Это печально отличается от Database :: addConnectionInfo (), которая

public static function addConnectionInfo($key, $target, $info)

Кроме того, в DB_select ключ $ не является параметром, хотя он находится в массиве параметров:

function db_select($table, $alias = NULL, array $options = array()) {
  if (empty($options['target'])) {
    $options['target'] = 'default';
  }
  return Database::getConnection($options['target'])->select($table, $alias, $options);
}

пока

  final public static function getConnection($target = 'default', $key = NULL) {

, так что это подразумевает, что «ведущий», «ведомый» или «по умолчанию» всегда используется как установленный, но не ключ для альтернативной базы данных / схемы, требующий db_set_active ('...'); и db_set_active (); вокруг db_select.

Поскольку при обработке db_select могут легко потребоваться вызовы других баз данных (например, вызовы devel или вызовы alters), это негибкая конструкция. Изменение этого вызова:

  return Database::getConnection($options['target'])->select($table, $alias, $options);

для добавления параметра Key (он уже указан в качестве аргумента !!) необходим, но, насколько я вижу, этого недостаточно.

...