2011-01-29 2 views
9

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

При подключении к внешнему источнику данных (в соответствии с документацией Drupal) вы установили активный db, запустите запрос, а затем установите активный db на значение по умолчанию.

например.

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

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

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

ответ

12

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

http://drupal.org/node/18429 также имеет некоторые примеры кода, особенно если вы хотите динамически настраивать параметры базы данных, то есть не жестко закодированы в settings.php. Например, если вы сохранили настройки базы данных где-то иначе, чем в settings.php, вы можете динамически создать массив и использовать Database :: addConnectionInfo() для соединения с базой данных. – sillygwailo

+6

'$ phpbb = База данных :: getConnection ($ target = 'default', key = 'phpbb');' это ошибка, которую я вижу время от времени, и я не понимаю, как люди могут прийти к такому коду , То, что вы хотели, это '$ phpbb = Database :: getConnection ('default', 'phpbb');' единственная причина, по которой ваш код работал, заключается в том, что выражение '$ target = 'default'' оценивает' default', однако переменная ' $ target' в области * caller * изменяется на '' default'', который, вероятно, не указан. – chx

+0

@chx Согласен - ответ обновлен :) – thtas

1

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

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

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

0

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

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

Это, к сожалению, отличается от базы данных :: 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) { 

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

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

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

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

Смежные вопросы