drupal 中可以进行跨数据库连接吗?

假设你有两个数据库, drupalold_data_source. 。你想参加 drupal.nodeold_data_source.page.

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

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

有帮助吗?

解决方案

Drupal没有支持同时具有一个以上的活动数据库。主要的原因是很可能这是一个MySQL特定的功能。

可以用PHP做到这一点,并跳过Drupal数据库层。因为它是只针对应运行一次迁移脚本,它会被罚款,以使代码数据库的。只要我们mysql_ connect等可能是一个好主意,使用结束db_set_active

其他提示

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

看看评论中的例子 默认.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 数据库关联的数据库用户有权访问这两个数据库,否则此技巧将不起作用。

我只想添加到这个答案,因为我最近遇到这个问题我自己。由远及(对我来说)最简单的解决方案是创建一个MySQL 视图那并联接在幕后。这消除了需要的跨数据库加入drupal的本身内。

在除了使用我之前提到的settings.php招前缀,还可以硬编码前缀的查询字符串传递给db_query()(类似于你在你的问题做了什么)。

因此,在这种情况下,你有

drupal.node inner join old_data_source.page on blablabla

测试在D7。

当然,你正在使用的db_set_active参数的用户能够访问这两个数据库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top