Como posso configurar várias conexões com o banco de dados?

12

Alguém pode me ajudar a configurar a conexão com vários bancos de dados no Drupal 8? Eu tenho banco de dados no mesmo servidor e quero acessá-lo junto com o banco de dados Drupal 8 padrão.

Mudassar Ali
fonte
Adicione as informações do banco de dados em seu arquivo settings.php e você pode alternar para o banco de dados diferente usando drupal.org/node/2204083
Olá @IvanJaros, considere adicionar isso como resposta, pois ele responde à pergunta.
digital

Respostas:

13

Isso é feito da mesma maneira que no Drupal 7, você pode adicionar as credenciais do banco de dados no seu arquivo 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',
);

Agora você terá duas opções de conexão, padrão e externas. Você pode alternar entre eles usando:

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

// Switch back
\Drupal\Core\Database\Database::setActiveConnection();
googletorp
fonte
Onde você faria essas mudanças ... do local para a produção, por exemplo.
TikaL13
@ TikaL13 Você alterna quando precisa buscar / colocar dados de / para uma fonte externa e alterna quando termina a busca / inserção.
googletorp
@googletorp Quando o banco de dados externo não está disponível, ocorre um erro interno do servidor 500. IDK drupal tentando fazer a conexão no bootstrap ou o quê. Como pode fazer sair graciosamente? Muito obrigado
Mudassar Ali
@MudassarAli Talvez você consiga fazer algo em uma instrução try / catch em que realmente alterna o banco de dados. Não é um erro que eu esteja familiarizado, embora não tenha certeza do que acontece #
googletorp
1
Não é necessário alterar a conexão ativa. Em vez disso, use Database::getConnection('external')e evite mexer com o estado global.
Pierre Buyle
5

Além de recuperar uma conexão de banco de dados com o banco de dados externo usando Database::getConnection(), você também pode usar a injeção de dependência em seu código para recuperar a conexão como uma dependência e declarar sua conexão no arquivo YAML de serviços de um 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
fonte
Esse é um bom truque, mas exige que você efetue as consultas por conta própria. Isso não funcionará se você precisar permitir que as funções internas do Drupal façam coisas como carregar entidades e salvar entidades. (Por exemplo, se os sites tiverem tipos de conteúdo compartilhado)
googletorp
O banco de dados do Drupal é gerenciado pelo próprio Drupal, o sistema de entidades gerencia a maioria das suas tabelas de conteúdo. O Drupal não foi criado para compartilhar conteúdo no nível do banco de dados. Fazer isso parece muito frágil (isto é, depende de muitas coisas que você não pode controlar). Mesmo em alfa, algo como drupal.org/project/replication parece muito mais seguro.
Pierre Buyle
1
Esta é uma excelente solução, mas notei que pelo menos a partir da versão 8.3 você precisa fornecer dois parâmetros para a fábrica de conexões na ordem inversa da esperada: argumentos: ['padrão', 'externo']
acrosman
2

muito obrigado, @googletorp!

Aqui está um exemplo um pouco mais completo - meu código para selecionar usuários de um banco de dados D7 que criaram nós:

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