如何在自定义模块中定义和使用外部数据库连接


10

我正在开发一个将严重依赖外部数据库查询的模块。是否有在整个模块中定义和使用外部数据库连接的最佳实践?

该页面告诉我如何建立连接,但是没有告诉我将其放置在模块中的位置(特定的挂钩?),因此我只需定义一次即可。另外,是否总是需要执行“ db_set_active('YourDatabaseKey');” 或者我可以传递一个参数来设置要使用的数据库?我正在使用Drupal 7。


如果您使用不同类型的数据库,则需要DBTNG模块
Sivaji

感谢您的建议,但是仅当您使用Drupal 6时,才需要该模块。我使用Drupal7。–
Whiskey

Answers:


10

没有特别的地方可以放置此代码(挂钩或模块),只需将其放在需要的位置即可。
因此,它应该刚好在您对另一个数据库的查询之前,而在刚要设置默认数据库之后。

如果您的所有模块都将依赖于外部数据库,则只需将其放在为模块调用的第一个函数的开头,以及最后一个函数的末尾。

当然,您的每一项功能都应在外部DB上执行,并且无需查询而无需切换回默认数据库。

以下代码将失败:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

$node = node_load(123); //This would fail on the external DB.

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

您应该来回切换:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 
$node = node_load(123); //Query made on the default Drupal DB.
db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

2
感谢您的解释。我最终创建了一个单独的函数,该函数使用db_set_active选择我的外部数据库,如果失败,它将添加数据库配置,然后重试。这样,我可以在运行外部查询之前在不同的挂钩中使用它,但是正如您所指出的,我确实需要再次将默认设置为活动状态。
威士忌酒

4

您将必须添加到settings.php位于/sites/default/以下语法中

// Drupal 6

$db_url['default'] = 'mysql://db_user:password@localhost/db_name';
$db_url['external'] = 'mysql://db_user2:password@localhost/db_name2';

// Drupal 7

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'db1',
      'username' => 'user1',
      'password' => 'pass',
      'host' => 'host1',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
  'extra' =>
  array (
    'default' =>
    array (
      'database' => 'db2',
      'username' => 'user2',
      'password' => 'pass',
      'host' => 'host2',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

在完成这些设置之后,您可以使用db_set_active()在数据库之间进行切换。


谢谢,您可以通过这种方式进行操作,但是我选择了在模块中进行操作,如问题所在链接的页面所述。这样,您可以让管理员用户在管理员设置表单上填写自己的配置。
威士忌酒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.