在Drupal中使用多个数据库连接

老葛的Drupal培训班 Think in Drupal

数据库抽象层给我们带来了多项好处,比如函数名称更好记了,查询中内置了安全特性,等等。有时候,我们需要连接到第3方或者遗留的数据库上,如果Drupal的数据库API能满足这一需要并同时提供安全特性的话,那该多美啊。不错,我们可以实现这一点!例如,在你的模块中,你可以连接到一个非Drupal的数据库,并从中取出数据。
 
在settings.php文件中,$db_url既可以是一个字符串(通常是这样的),也可以是包含多个数据库连接的字符串数组。下面是默认的语法,声明了一个单独的连接:
$db_url = 'mysql://username:password@localhost/databasename';
 
当使用一个数组时,它的键就是在激活数据库连接时所引用的简洁名称,而它的值就是连接的字符串本身。下面是一个例子,在这里我们声明了两个连接字符串, default(默认的)和legacy(遗留的):
 
$db_url['default'] = 'mysql://user:password@localhost/drupal6';
$db_url['legacy'] = 'mysql://user:password@localhost/legacydatabase';
 
注意 Drupal本身使用的数据库一定要以default为键。
 
    当你需要连接到Drupal中其它的数据库上时,你首先使用它的键名激活该连接,当你使用完连接时,将它切换回到默认的连接上。
 
// Get some information from a non-Drupal database.
db_set_active('legacy');
$result = db_query("SELECT * FROM ldap_user WHERE uid = %d", $user->uid);
 
// Switch back to the default connection when finished.
db_set_active('default');
 
注意 切记一定要切换回到默认的连接上,这样Drupal可以干净的完成整个请求生命周期并重新回到自己的表中。
 
    由于数据库抽象层设计的是为每个数据库使用相同的函数名,所以不能够同时使用多个数据库后台(比如,同时使用MySQL 和 PostgreSQL)。然而,在同一个站点还是可以同时使用MySQL 和 PostgreSQL连接的,如何实现的更多详细,请参看http://drupal.org/node/19522
 

Drupal版本: