【问题标题】:Cross Database Table Joins in Drupal?Drupal中的跨数据库表连接?
【发布时间】:2011-03-25 18:21:52
【问题描述】:

drupal 可以跨数据库连接吗?

假设您有两个数据库,drupalold_data_source。你想加入drupal.nodeold_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 结束可能是个好主意

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-19
            • 2011-08-16
            • 1970-01-01
            • 1970-01-01
            • 2010-12-13
            • 1970-01-01
            相关资源
            最近更新 更多