繁体   English   中英

跨数据库表加入Drupal?

[英]Cross Database Table Joins in Drupal?

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

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

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

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

有一个鲜为人知的技巧可以完成此任务,它依赖于称为表前缀的功能。 您可以将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数据库关联的数据库用户具有访问这两个数据库的特权,否则此技巧将不起作用。

我想补充一下这个答案,因为我本人最近遇到了这个问题。 到目前为止,最简单的解决方案(以我为例)是创建一个在后台进行联接的mysql 视图 这就消除了在drupal本身内部进行跨数据库联接的需要。

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

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

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

所以在这种情况下

drupal.node inner join old_data_source.page on blablabla

在d7上测试。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM