Как я могу настроить несколько соединений с базой данных?


12

Может ли кто-нибудь помочь мне настроить соединение с несколькими базами данных в Drupal 8? У меня есть база данных на том же сервере, и я хочу получить к ней доступ вместе с базой данных Drupal 8 по умолчанию.


Добавьте информацию о базе данных в файл settings.php, и вы можете переключиться на другую базу данных, используя drupal.org/node/2204083

Привет @IvanJaros, пожалуйста, рассмотрите возможность добавления этого ответа, так как он действительно отвечает на вопрос.
цифровой

Ответы:


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

@ TikaL13 Вы переключаетесь, когда вам нужно извлечь / поместить данные из / на внешний источник, и вы переключаетесь обратно, когда закончите выборку / ввод.
googletorp

@googletorp Когда внешняя база данных недоступна, то есть внутренняя ошибка сервера 500. IDK drupal пытается установить соединение при начальной загрузке или что. Как можно сделать изящный уход? Большое спасибо
Мудассар Али

@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 выполнять такие вещи, как загрузка сущностей и сохранение сущностей. (Fx, если сайты имеют общие типы контента)
googletorp

БД Drupal управляется самим Drupal, система управления сущностями управляет большинством ваших таблиц контента. Drupal не предназначен для обмена контентом на уровне базы данных. Это кажется очень хрупким (то есть, я зависит от слишком многих вещей, которые вы не можете контролировать). Даже в альфе что-то вроде drupal.org/project/replication кажется намного безопаснее.
Пьер Байл

1
Это отличное решение, но я заметил, что по крайней мере с 8.3 вам нужно предоставить два параметра фабрике соединений в обратном порядке, чем я ожидал: arguments: ['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();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.