是否可以在drupal中进行跨数据库连接?
假设您有两个数据库,drupal
和old_data_source
。您想加入drupal.node
加入old_data_source.page
。
db_set_active()
来使用多个数据库。但无法找到有关跨数据库表连接的任何内容!
(我将此作为迁移脚本的一部分进行调查,并将删除old_data_source
)
答案 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参数中使用的用户必须能够访问这两个数据库。