[英]Cross Database Table Joins in Drupal?
是否可以在drupal中进行跨数据库联接?
假设您有两个数据库drupal
和old_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.