2011-01-29 76 views
9

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

当连接到外部数据源(如每drupal的文档)已设置的活性分贝,运行查询,然后将有效分贝回默认。

例如

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

但是有什么办法使用Drupal的数据库包装打造,可永久设置为新的数据库,而不必做这种切换回往复废话了全新的连接?当然,我们可以同时处理到多个数据库的连接。

我做了一些谷歌搜索,但没有发现任何人试图做到这一点尚未。

回答

12

典型。发布5分钟后我看着办吧......所以,对于未来的Google:

基本上,你不使用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 2011-01-29 23:16:44

1

Database::addConnectionInfo()也许?

该方法允许在 运行时添加新的连接凭证。在正常情况下,指定 数据库凭证的首选方式是通过settings.php。然而,该方法允许 它们在任意时间,例如在单元测试中添加,当 连接到管理员定义的第三方数据库等

如果给定的键/靶对已经存在,该方法将忽略 。

0

为的getConnection的定义列举了参数比上面使用不同的顺序。

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

这是可悲的不同数据库:: addConnectionInfo(),这是

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

此外,在DB_select,$ key则不是一个参数,但它是选项数组中:

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的处理过程中很容易要求调用其他dbs(比如devel调用或者改变调用),所以这是不灵活的设计。改变这一呼吁:

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

添加的关键参数(它已经只具备作为参数!!)需要的,但到目前为止,我现在可以看到不足。