Несколько параллельных подключений к базе данных в 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);
чтобы добавить ключевой параметр (он уже указан в качестве аргумента!!) необходим, но недостаточен, насколько я могу сейчас видеть.