1

是否可以在drupal中进行跨数据库连接?

假设您有两个数据库,drupal并且old_data_source. 你想加入drupal.nodeold_data_source.page.

db_set_active()可以调用以使用多个数据库。但是找不到有关跨数据库表连接的任何信息!

(我正在将其作为迁移脚本的一部分进行研究,并将删除old_data_source

4

4 回答 4

5

有一个鲜为人知的技巧可以实现这一点,它依赖于一种称为表前缀的功能。您可以配置您的 settings.php 以在查询中使用另一个数据库的名称作为某些表的前缀,这样您就可以进行跨数据库连接。

查看default.settings.php注释中的示例(类似的语法适用于 Drupal 6),了解如何设置。在原始问题的情况下,您的默认 $databases 条目上有一个前缀数组,如下所示:

'prefix' => array('page' => 'old_data_source.'),

然后使用以下内容构建查询:

db_query("SELECT * FROM {node} n LEFT JOIN {page} p on n.nid=p.nid");

Drupal DB 抽象层将解释 {page} 并将其转换为 SQL,如:

SELECT * FROM node n LEFT JOIN old_data_source.page p on n.nid=p.nid;

唯一要确保的另一件事是与您的默认 Drupal 数据库关联的数据库用户具有访问这两个数据库的权限,否则这个技巧将不起作用。

于 2012-03-19T15:18:49.797 回答
3

我只想补充一下这个答案,因为我最近自己也遇到了这个问题。到目前为止,最简单的解决方案(在我的情况下)是创建一个在幕后进行连接的 mysql视图。这消除了在 drupal 内部进行跨数据库连接的需要。

于 2013-08-06T18:43:57.993 回答
1

Drupal 不支持一次拥有多个活动数据库。主要原因可能是这是 mysql 的特定功能。

您可以使用 php 执行此操作并跳过 Drupal 数据库层。由于它仅适用于应该运行一次的迁移脚本,因此可以将代码数据库设置为特定的。只有我们mysql_ connect等。结束使用可能是个好主意db_set_active

于 2010-08-05T12:05:15.683 回答
1

除了在我之前提到的 settings.php 技巧中使用前缀之外,您还可以在传递给 db_query() 的查询字符串中对前缀进行硬编码(类似于您在问题中所做的)。

所以在这种情况下你会有

drupal.node inner join old_data_source.page on blablabla

在 d7 上测试。

当然,您在 db_set_active 参数中使用的用户必须有权访问这两个数据库。

于 2012-03-19T15:35:31.787 回答