【问题标题】:Multiple concurrent database connections in drupal 7drupal 7中的多个并发数据库连接
【发布时间】:2011-01-29 19:54:03
【问题描述】:

我正在为我的 drupal 7 站点编写一个包装类,它可以让我连接并查询我的 phpbb 数据库。

连接到外部数据源时(根据 drupal 文档),您已设置活动数据库,运行查询,然后将活动数据库设置回默认值。

例如

db_set_active('phpbb');
$result = db_query($sql,$args,$opts);                               
db_set_active();//back to default

但是有没有办法使用drupal 的数据库包装器来创建一个全新的连接,可以永久设置到新的数据库,而不必进行这种来回切换的废话?当然,我们可以同时处理与多个数据库的连接。

我已经进行了一些谷歌搜索,但尚未发现有人尝试这样做。

【问题讨论】:

    标签: drupal drupal-7


    【解决方案1】:

    典型。发布后 5 分钟我就明白了……所以,对于未来的谷歌人:

    基本上,您不使用 db_query,而是在连接上运行查询而不设置活动链接。

    您可以通过查看 db_query 的工作原理来了解这一点: http://api.drupal.org/api/drupal/includes--database--database.inc/function/db_query/7

    所以它看起来像这样:

    $target='default';
    $key = 'phpbb';
    $phpbb = Database::getConnection($target,$key);
    $result = $phpbb->query($sql,$args,$opts);
    

    这假设您在 settings.php 中配置了一个数据库,如下所示:

    $databases['phpbb']['default'] = array(
        'driver' => 'mysql',
        'database' => 'forum',
        'username' => 'username',
        'password' => 'password',
        'host' => 'mysql.host.com',
        'prefix' => 'phpbb3_'
    );
    

    【讨论】:

    • drupal.org/node/18429 也有一些代码示例,特别是如果您想动态配置数据库设置,即不在 settings.php 中硬编码。例如,如果您将数据库设置存储在 settings.php 之外的其他位置,则可以动态创建数组并使用 Database::addConnectionInfo() 来建立数据库连接。
    • $phpbb = Database::getConnection($target='default', key='phpbb'); 这是我不时看到的一个错误,我不知道人们怎么能得到这样的代码。你想要的是$phpbb = Database::getConnection('default', 'phpbb'); 你的代码工作的唯一原因是表达式$target = 'default' 评估为default 但是 caller 范围中的变量$target 更改为'default' 这可能是没有缩进。
    • 叹息。你还想要$phpbb = Database::getConnection('default', 'phpbb');。这些变量仍然是不必要的。
    【解决方案2】:

    Database::addConnectionInfo() 或许?

    此方法允许在以下位置添加新的连接凭据 运行。一般情况下首选方式指定 数据库凭据是通过 settings.php。然而,这种方法允许 它们可以在任意时间添加,例如在单元测试期间,当 连接到管理员定义的第三方数据库等。

    如果给定的键/目标对已经存在,这个方法将是 忽略。

    【讨论】:

      【解决方案3】:

      getConnection 的定义引用了与上述不同的参数顺序。

      function getConnection($target = 'default', $key = NULL)
      

      这与 Database::addConnectionInfo() 很不同,后者是

      public static function addConnectionInfo($key, $target, $info)
      

      另外,在 DB_select 上,$key 不是参数,尽管它在选项数组中:

      function db_select($table, $alias = NULL, array $options = array()) {
        if (empty($options['target'])) {
          $options['target'] = 'default';
        }
        return Database::getConnection($options['target'])->select($table, $alias, $options);
      }
      

      同时

        final public static function getConnection($target = 'default', $key = NULL) {
      

      所以这意味着'master'或'slave'或'default'总是作为设置使用,但不是替代数据库/模式的关键,需要 db_set_active('...');和 db_set_active();在 db_select 周围。

      由于在 db_select 的处理过程中很容易需要调用其他 dbs(例如 devel 调用或 alters 调用),因此这是一种不灵活的设计。更改此调用:

        return Database::getConnection($options['target'])->select($table, $alias, $options);
      

      需要添加 Key 参数(它已经被指定为参数!!)但就我现在所见而言还不够。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 2011-03-25
        • 1970-01-01
        相关资源
        最近更新 更多