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


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.