Comment configurer plusieurs connexions à la base de données?

12

Quelqu'un peut-il m'aider à établir une connexion avec plusieurs connexions de bases de données dans Drupal 8? J'ai une base de données sur le même serveur et je veux y accéder avec la base de données Drupal 8 par défaut.

Mudassar Ali
la source
Ajoutez les informations de la base de données dans votre fichier settings.php et vous pouvez basculer dans une base de données différente en utilisant drupal.org/node/2204083
Bonjour @IvanJaros, pensez à ajouter ceci comme réponse car il répond à la question.
numérique

Réponses:

13

Cela se fait de la même manière que dans Drupal 7, vous pouvez ajouter les informations d'identification de la base de données dans votre fichier 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',
);

Vous aurez maintenant deux options de connexion, par défaut et externe. Vous pouvez basculer entre eux en utilisant:

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

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();
googletorp
la source
Où feriez-vous ces changements ... du local à la production par exemple.
TikaL13
@ TikaL13 Vous changez lorsque vous avez besoin de récupérer / mettre des données de / vers une source externe et vous revenez en arrière lorsque vous avez terminé avec la récupération / put.
googletorp
@googletorp Lorsque la base de données externe n'est pas disponible, erreur de serveur interne 500 obtenue. IDK drupal essaie de se connecter au bootstrap ou quoi. Comment faire cesser gracieusement? Merci beaucoup
Mudassar Ali
@MudassarAli Vous pourriez être en mesure de faire quelque chose dans une instruction try / catch où vous changez réellement de base de données. Ce n'est pas une erreur que je connais, donc je ne sais pas ce qui se passe
googletorp
1
La modification de la connexion active n'est pas nécessaire. Au lieu de cela, utilisez Database::getConnection('external')et évitez de jouer avec l'état global.
Pierre Buyle
5

En plus de récupérer une connexion de base de données à la base de données externe à l'aide Database::getConnection(), vous pouvez également utiliser l' injection de dépendance dans votre code pour récupérer la connexion en tant que dépendance et déclarer votre connexion dans le fichier YAML des services d'un module:

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
la source
Ceci est une bonne astuce, mais vous oblige à faire les requêtes vous-même. Cela ne fonctionnera pas si vous devez laisser les fonctions internes de Drupal faire des choses comme charger des entités et enregistrer des entités. (Fx si les sites ont des types de contenu partagés)
googletorp
La base de données de Drupal est gérée par Drupal lui-même, le système d'entités gère la plupart de vos tables de contenu. Drupal n'est pas fait pour partager du contenu au niveau de la base de données. Cela semble très fragile (c'est-à-dire que je dépend de trop de choses que vous ne pouvez pas contrôler). Même en alpha, quelque chose comme drupal.org/project/replication semble beaucoup plus sûr.
Pierre Buyle
1
C'est une excellente solution, mais j'ai remarqué qu'au moins à partir de la version 8.3, vous devez fournir deux paramètres à la fabrique de connexions dans l'ordre inverse de ce que j'attendais: arguments: ['default', 'external']
acrosman
2

merci beaucoup, @googletorp!

voici un exemple un peu plus complet - mon code pour sélectionner les utilisateurs d'une base de données D7 qui ont créé des nœuds:

\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
la source