¿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.


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();

¿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']

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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.