是否可以在drupal中进行跨数据库连接?
假设您有两个数据库,drupal
并且old_data_source
. 你想加入drupal.node
到old_data_source.page
.
db_set_active()
可以调用以使用多个数据库。但是找不到有关跨数据库表连接的任何信息!
(我正在将其作为迁移脚本的一部分进行研究,并将删除old_data_source
)
是否可以在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 参数中使用的用户必须有权访问这两个数据库。