2011-01-29 68 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); 

添加的關鍵參數(它已經只具備作爲參數!!)需要的,但到目前爲止,我現在可以看到不足。