¿Cómo puedo configurar múltiples conexiones de base de datos?

12

¿Alguien puede ayudarme a configurar la conexión con múltiples conexiones de bases de datos en Drupal 8? Tengo una base de datos en el mismo servidor y quiero acceder a ella junto con la base de datos Drupal 8 predeterminada.

Mudassar Ali
fuente
Agregue la información de la base de datos a su archivo settings.php y puede cambiar a una base de datos diferente usando drupal.org/node/2204083
Hola @IvanJaros, considera agregar esto como respuesta, ya que responde la pregunta.
digital

Respuestas:

13

Esto se hace de la misma manera que en Drupal 7, puede agregar las credenciales de la base de datos en su archivo 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',
);

Ahora tendrá dos opciones de conexión, predeterminada y externa. Puedes cambiar entre ellos usando:

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

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();
googletorp
fuente
¿Dónde estaría haciendo estos cambios ... de local a producción, por ejemplo.
TikaL13
@ TikaL13 Cambia cuando necesita recuperar / colocar datos desde / a una fuente externa y cambia cuando haya terminado con la recuperación / colocación.
googletorp
@googletorp Cuando la base de datos externa no está disponible, se obtuvo el error interno del servidor 500. IDK drupal intentando establecer una conexión en bootstrap o qué. ¿Cómo puede dejar de fumar con gracia? Muchas gracias
Mudassar Ali
@MudassarAli Es posible que pueda hacer algo en una declaración try / catch donde realmente cambia la base de datos. No es un error con el que estoy familiarizado, así que no estoy seguro de lo que sucede
googletorp
1
No es necesario cambiar la conexión activa. En cambio, use Database::getConnection('external')y evite meterse con el estado global.
Pierre Buyle
5

Además de recuperar una conexión de base de datos a la base de datos externa utilizando Database::getConnection(), también puede usar la inyección de dependencia en su código para recuperar la conexión como dependencia y declarar su conexión en el archivo YAML de servicios de un módulo:

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
fuente
Este es un buen truco, pero requiere que usted mismo haga las consultas. Esto no funcionará si necesita dejar que las funciones internas de Drupal hagan cosas como cargar entidades y guardar entidades. (Fx si los sitios han compartido tipos de contenido)
googletorp
La base de datos de Drupal es administrada por Drupal, el sistema de entidades administra la mayoría de sus tablas de contenido. Drupal no está hecho para compartir contenido a nivel de base de datos. Hacerlo parece muy frágil (es decir, depende de muchas cosas que no puedes controlar). Incluso en alfa, algo como drupal.org/project/replication parece mucho más seguro.
Pierre Buyle
1
Esta es una excelente solución, pero me di cuenta de que al menos a partir de 8.3 debe proporcionar dos parámetros a la fábrica de conexiones en el orden inverso al esperado: argumentos: ['default', 'external']
acrosman
2

muchas gracias, @googletorp!

Aquí hay un ejemplo un poco más completo: mi código para seleccionar usuarios de una base de datos D7 que han creado nodos:

\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
fuente