Як я можу встановити кілька підключень до бази даних?


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 Ви перемикаєтесь, коли вам потрібно отримати / перенести дані з / у зовнішнє джерело, і ви переключитесь назад, коли закінчите з витягом / put.
googletorp

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

@MudassarAli Можливо, вам вдасться щось зробити в операції спробу / 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 вам потрібно надати два параметри до фабрики з'єднань у зворотному порядку, ніж я очікував: аргументи: ['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.