Несколько параллельных подключений к базе данных в drupal 7

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

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

например

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

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

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

3 ответов


Типичный. Через 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);

предполагается, что у вас есть база данных настраивается в настройках.php нравится следующее:

$databases['phpbb']['default'] = array(
    'driver' => 'mysql',
    'database' => 'forum',
    'username' => 'username',
    'password' => 'password',
    'host' => 'mysql.host.com',
    'prefix' => 'phpbb3_'
);

база данных:: addConnectionInfo () возможно?

этот метод позволяет добавлять новые учетные данные в связи во время выполнения. При нормальных обстоятельствах предпочтительный способ указать учетные данные базы данных через настройки.РНР. Однако, этот метод позволяет их следует добавлять в произвольное время, например во время модульных тестов, когда подключение к сторонним базам данных, определенным администратором, и т. д.

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


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

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

это, к сожалению, отличается от Database:: addConnectionInfo (), который является

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

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

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) {

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

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

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

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