Pergunta

É possível fazer o Cross Database Juns no Drupal?

Diga que você tem dois bancos de dados, drupal e old_data_source. Você quer se juntar drupal.node para old_data_source.page.

db_set_active() pode ser chamado para usar vários bancos de dados. No entanto, não consigo encontrar nada sobre a tabela de banco de dados cruzada.

(Estou analisando isso como parte de um script de migração e estarei removendo old_data_source)

Foi útil?

Solução

O Drupal não suporta ter mais de um banco de dados ativo por vez. O principal motivo é provavelmente que esse é um recurso específico do MySQL.

Você pode fazer isso com PHP e pular a camada de banco de dados Drupal. Como é apenas para um script de migração que deve ser executado uma vez, será bom tornar o banco de dados de código específico. Só nós mysql_ connect etc. provavelmente é uma boa ideia terminar usando db_set_active

Outras dicas

Há um truque pouco conhecido para conseguir isso, que depende de um recurso chamado Prefixação da Tabela. Você pode configurar seu configuração.php para prefixar certas tabelas em suas consultas com o nome de outro banco de dados, para que você possa fazer junções de dados cruzados.

Dê uma olhada nos exemplos nos comentários do default.settings.php (Sintaxe semelhante se aplica ao Drupal 6) para ver como configurar isso. No caso da pergunta original, você teria uma matriz de prefixos na entrada padrão $ bancos de dados que se parecem:

'prefix' => array('page' => 'old_data_source.'),

E então construa uma consulta com algo como:

db_query("SELECT * FROM {node} n LEFT JOIN {page} p on n.nid=p.nid");

A camada de abstração do Drupal DB interpretará o {página} e a converterá em SQL como:

SELECT * FROM node n LEFT JOIN old_data_source.page p on n.nid=p.nid;

A única outra coisa a garantir é que o usuário do banco de dados associado ao seu banco de dados Drupal padrão tenha privilégios para acessar os dois bancos de dados, ou esse truque não funcionará.

Eu gostaria de acrescentar a essa resposta, porque eu mesmo confrontei esse problema recentemente. A solução mais fácil de longe (no meu caso) era criar um mysql Visão Isso fez a junção nos bastidores. Isso elimina a necessidade do banco de dados cruzado se junta ao próprio Drupal.

Além de usar o prefixo no truque do Settings.php observado antes de mim, você também pode codificar o prefixo na sequência de consulta que você passa para db_query () (semelhante ao que você fez em sua pergunta).

Então, neste caso, você teria

drupal.node inner join old_data_source.page on blablabla

Testado em D7.

Obviamente, o usuário que você está usando no argumento db_set_active precisa ter acesso a ambos os bancos de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top