跨数据库表加入Drupal?

时间:2010-08-05 11:41:25

标签: php drupal join database-abstraction

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

假设您有两个数据库,drupalold_data_source。您想加入drupal.node加入old_data_source.page

可以调用

db_set_active()来使用多个数据库。但无法找到有关跨数据库表连接的任何内容!

(我将此作为迁移脚本的一部分进行调查,并将删除old_data_source

4 个答案:

答案 0 :(得分:4)

有一个鲜为人知的技巧可以实现这一点,它依赖于一个名为表前缀的功能。您可以将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数据库关联的数据库用户具有访问这两个数据库的权限,否则这个技巧将无效。

答案 1 :(得分:3)

我想补充一下这个答案,因为我最近自己遇到了这个问题。到目前为止最简单的解决方案(在我的例子中)是创建一个在幕后进行连接的mysql view。这消除了在drupal本身内交叉数据库连接的需要。

答案 2 :(得分:1)

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

您可以使用php执行此操作并跳过Drupal数据库层。因为它只适用于应该运行一次的迁移脚本,所以可以使代码数据库具体化。只是我们mysql_ connect等。使用db_set_active

结束可能是一个好主意

答案 3 :(得分:1)

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

所以在这种情况下你会有

drupal.node inner join old_data_source.page on blablabla

在d7上测试。

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