drupal 7中的多个并发数据库连接

时间:2011-01-29 19:54:03

标签: drupal drupal-7

我正在为drupal 7网站编写一个包装类,它允许我连接并查询我的phpbb数据库。

连接到外部数据源时(根据drupal文档),您已设置活动数据库,运行查询,然后将活动数据库恢复为默认值。

e.g。

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

但有没有办法使用drupal的数据库包装器来创建一个全新的连接,可以永久设置到新的数据库,而无需这样做来回切换废话?当然,我们可以同时处理与多个数据库的连接。

我做了一些谷歌搜索,但还没有找到任何人试图这样做。

3 个答案:

答案 0 :(得分:12)

典型。发布后5分钟我想出来......所以,对于未来的googlers:

基本上,您不使用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 :(得分:1)

或许

Database::addConnectionInfo()

  

此方法允许添加新的连接凭据   运行。一般情况下指定的首选方式   数据库凭据是通过settings.php。但是,这种方法允许   它们是在任意时间添加的,例如在单元测试期间,何时   连接到管理员定义的第三方数据库等

     

如果给定的键/目标对已存在,则此方法将为   忽略。

答案 2 :(得分:0)

getConnection的定义引用了与上面使用的参数不同的顺序。

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

这与数据库:: addConnectionInfo()

有很大的不同
public static function addConnectionInfo($key, $target, $info)

另外,在DB_select上,$ key不是参数,尽管它位于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周围。

由于在db_select的处理过程中很容易需要调用其他dbs(例如devel调用或调用中的调用),这是不灵活的设计。改变这个电话:

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

添加Key参数(它已经被指定为参数!!)是需要的,但是到目前为止我看不到。