【问题标题】:Cross Database Table Joins in Drupal?Drupal中的跨数据库表连接?
【发布时间】:2011-03-25 18:21:52
【问题描述】:
drupal 可以跨数据库连接吗?
假设您有两个数据库,drupal 和 old_data_source。你想加入drupal.node到old_data_source.page。
db_set_active() 可以被调用来使用多个数据库。但是找不到有关跨数据库表连接的任何信息!
(我正在将其作为迁移脚本的一部分进行调查,并将删除 old_data_source)
【问题讨论】:
标签:
php
drupal
join
database-abstraction
【解决方案1】:
我只想补充一下这个答案,因为我最近自己也遇到了这个问题。到目前为止(在我的情况下)最简单的解决方案是创建一个 mysql view 在幕后进行连接。这消除了在 drupal 内部进行跨数据库连接的需要。
【解决方案2】:
除了在我之前提到的 settings.php 技巧中使用前缀之外,您还可以在传递给 db_query() 的查询字符串中硬编码前缀(类似于您在问题中所做的)。
所以在这种情况下你会有
drupal.node inner join old_data_source.page on blablabla
在 d7 上测试。
当然,您在 db_set_active 参数中使用的用户必须有权访问这两个数据库。
【解决方案3】:
有一个鲜为人知的技巧来实现这一点,它依赖于一种称为表前缀的功能。您可以配置您的 settings.php 以在查询中使用另一个数据库的名称作为某些表的前缀,这样您就可以进行跨数据库连接。
查看default.settings.php 的 cmets 中的示例(类似的语法适用于 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 数据库关联的数据库用户具有访问这两个数据库的权限,否则这个技巧将不起作用。
【解决方案4】:
Drupal 不支持一次拥有多个活动数据库。主要原因可能是这是mysql特有的功能。
您可以使用 php 执行此操作并跳过 Drupal 数据库层。由于它仅适用于应该运行一次的迁移脚本,因此可以将代码数据库具体化。只有我们mysql_ connect 等。使用db_set_active 结束可能是个好主意