如何设置多个数据库连接?


12

谁能帮助我在Drupal 8中设置与多个数据库连接的连接?我在同一服务器上有数据库,我想与默认的Drupal 8数据库一起访问它。


将数据库信息添加到您的settings.php文件中,您可以使用drupal.org/node/2204083

@IvanJaros,您好,请考虑将其添加为答案,因为它确实回答了问题。
数字

Answers:


13

此操作与Drupal 7中的操作相同,您可以在settings.php文件中添加数据库凭据。

$databases['default']['default'] = array(
  'database' => 'drupal8',
  'username' => 'username',
  'password' => 'password',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

$databases['external']['default'] = array(
  'database' => 'external',
  'username' => 'username',
  'password' => 'password',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);

现在,您将有两个连接选项,默认和外部。您可以使用以下方法在它们之间切换:

// Switch to external database
\Drupal\Core\Database\Database::setActiveConnection('external');
// Do queries...

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();

您将在哪里进行这些切换...例如从本地切换到生产。
TikaL13 2013年

@ TikaL13在需要从/从外部源获取/放入数据时切换,并在完成获取/放入操作后切换回。
googletorp

@googletorp当外部数据库不可用时,发生内部服务器错误500。IDK drupal尝试在引导程序或其他方式建立连接。如何才能优雅地戒烟?非常感谢
Mudassar Ali

@MudassarAli您可能可以在try / catch语句中执行实际切换数据库的操作。这不是我所熟悉的错误,但是不确定是否会发生
googletorp

1
无需更改活动连接。相反,请使用Database::getConnection('external')并避免弄乱全局状态。
皮埃尔·布伊

5

除了使用检索与外部数据库的数据库连接之外Database::getConnection(),您还可以在代码中使用依赖项注入来将连接作为依赖项进行检索,并在模块的服务YAML文件中声明您的连接:

database.external:
  class: Drupal\Core\Database\Connection
  factory: 'Drupal\Core\Database\Database::getConnection'
  arguments: ['external']

external_database_dependent_service:
  class: Drupal\MODULE\Some\Class\For\A\ServiceUsingTheExternalDatabase
  arguments: ['@database.external']

这是一个很好的技巧,但是需要您自己实际执行查询。如果您需要让Drupal内部函数执行诸如加载实体和保存实体之类的工作,这将无法工作。(如果网站具有共享的内容类型
则为

Drupal的数据库由Drupal本身管理,实体系统管理大多数内容表。不能使Drupal在数据库级别共享内容。这样做似乎非常脆弱(即,我依赖于您无法控制的太多东西)。即使在Alpha中,像drupal.org/project/replication之类的东西似乎也更安全。
皮埃尔·布伊

1
这是一个很好的解决方案,但我注意到至少从8.3版本开始,您需要以与我预期相反的顺序向连接工厂提供两个参数:参数:['default','external']
acrosman

2

非常感谢@googletorp!

这是一个稍微完整的示例-我的代码从D7数据库中选择已创建节点的用户:

\Drupal\Core\Database\Database::setActiveConnection('external');

// Get a connection going
$db = \Drupal\Core\Database\Database::getConnection();

$query = $db->select('users', 'u');
$query->fields('u', array('uid', 'name'));
$query->join('node', 'n', 'n.uid = u.uid');
$query->orderBy('uid');
$users = $query->execute()->fetchAllKeyed();

\Drupal\Core\Database\Database::setActiveConnection();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.