Wie kann ich mehrere Datenbankverbindungen einrichten?

11

Kann mir jemand helfen, eine Verbindung mit mehreren Datenbanken in Drupal 8 herzustellen? Ich habe eine Datenbank auf demselben Server und möchte zusammen mit der Standard-Drupal 8-Datenbank darauf zugreifen.

Mudassar Ali
quelle
Fügen Sie die Datenbankinformationen zu Ihrer settings.php-Datei hinzu und Sie können mithilfe von drupal.org/node/2204083
Hallo @IvanJaros, bitte erwäge, dies als Antwort hinzuzufügen, da es die Frage beantwortet.
Digital

Antworten:

12

Dies geschieht auf die gleiche Weise wie in Drupal 7, Sie können die Datenbankanmeldeinformationen in Ihrer Datei settings.php hinzufügen.

$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',
);

Sie haben jetzt zwei Verbindungsoptionen, Standard und extern. Sie können zwischen ihnen wechseln, indem Sie:

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

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();
googletorp
quelle
Wo würden Sie diese Schalter machen ... zum Beispiel von lokal zu Produktion.
TikaL13
@ TikaL13 Sie wechseln, wenn Sie Daten von / zu einer externen Quelle abrufen / ablegen müssen, und Sie wechseln zurück, wenn Sie mit dem Abrufen / Ablegen fertig sind.
googletorp
@googletorp Wenn keine externe Datenbank verfügbar ist, wurde der interne Serverfehler 500 angezeigt. IDK-Drupal versucht, eine Verbindung beim Bootstrap herzustellen oder was. Wie kann man anmutig aufhören? Vielen Dank
Mudassar Ali
@MudassarAli Möglicherweise können Sie in einer try / catch-Anweisung etwas tun, in dem Sie tatsächlich die Datenbank wechseln. Es ist kein Fehler, mit dem ich vertraut bin, also nicht sicher, was passiert
googletorp
Das Ändern der aktiven Verbindung ist nicht erforderlich. Verwenden Database::getConnection('external')und vermeiden Sie stattdessen das Durcheinander mit dem globalen Status.
Pierre Buyle
5

Zusätzlich zum Abrufen einer Datenbankverbindung zur externen Datenbank mithilfe von Database::getConnection()können Sie auch die Abhängigkeitsinjektion in Ihrem Code verwenden, um die Verbindung als Abhängigkeit abzurufen und Ihre Verbindung in der YAML-Datei für die Dienste eines Moduls zu deklarieren:

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']
Pierre Buyle
quelle
Dies ist ein netter Trick, aber Sie müssen die Abfragen tatsächlich selbst durchführen. Dies funktioniert nicht, wenn Sie die internen Funktionen von Drupal zum Laden von Entitäten und Speichern von Entitäten ausführen lassen müssen. (Fx, wenn Websites gemeinsame Inhaltstypen haben)
googletorp
Die Datenbank von Drupal wird von Drupal selbst verwaltet. Das Entitätssystem verwaltet die meisten Ihrer Inhaltstabellen. Drupal ist nicht dafür ausgelegt, Inhalte auf Datenbankebene freizugeben. Dies scheint sehr fragil zu sein (dh ich bin auf zu viele Dinge angewiesen, die man nicht kontrollieren kann). Selbst in Alpha scheint so etwas wie drupal.org/project/replication viel sicherer zu sein.
Pierre Buyle
1
Dies ist eine ausgezeichnete Lösung, aber ich habe festgestellt, dass Sie mindestens ab 8.3 zwei Parameter in umgekehrter Reihenfolge für die Verbindungsfactory bereitstellen müssen, als ich erwartet hatte: Argumente: ['default', 'external']
acrosman
2

Vielen Dank, @googletorp!

Hier ist ein etwas vollständigeres Beispiel - mein Code zum Auswählen von Benutzern aus einer D7-Datenbank, die Knoten erstellt haben:

\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();
lucoweb
quelle