Question

Est-il possible de faire la base de données dans les jointures croisées drupal?

Vous disposez de deux bases de données, drupal et old_data_source. Vous souhaitez rejoindre drupal.node à old_data_source.page.

db_set_active() peut être appelé à utiliser plusieurs bases de données. Cependant ne peut pas trouver quoi que ce soit au sujet de la table de base de données des jointures croisées!

(je suis à la recherche dans ce dans le cadre d'un script de migration et supprimerons old_data_source)

Était-ce utile?

La solution

Drupal ne supporte pas avoir plus d'une base de données active à la fois. La principale raison est probablement que c'est une caractéristique spécifique de MySQL.

Vous pouvez le faire avec php et sauter la couche de base de données Drupal. Comme il est seulement pour un script de migration qui devrait être exécuté une fois, ce sera bien pour rendre la base de données spécifique de code. Il suffit de nous mysql_ connect etc. probablement une bonne idée de mettre fin à l'aide db_set_active

Autres conseils

Il y a un truc peu connu pour ce faire, qui repose sur une fonctionnalité appelée tableau préfixage. Vous pouvez configurer votre settings.php préfixer certaines tables dans vos requêtes avec le nom d'une autre base de données, de sorte que vous pouvez faire joint plusieurs bases de données.

Regardez les exemples dans les commentaires de la default.settings.php (syntaxe similaire applique dans Drupal 6) pour voir comment le mettre en place. Dans le cas de la question initiale, vous auriez un tableau de préfixe sur votre entrée par défaut des bases de données $ qui ressemble à:

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

Et puis construire une requête avec quelque chose comme:

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

La couche d'abstraction DB Drupal interprétera la {page} et le convertir en SQL comme:

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

La seule autre chose à se assurer est que l'utilisateur de base de données associée à votre base de données par défaut Drupal a des privilèges d'accès à deux bases de données, ou cette astuce ne fonctionnera pas.

Je voudrais juste ajouter à cette réponse, parce que je me suis confronté à ce problème récemment. La solution la plus facile et de loin (dans mon cas) était de créer un mysql vue ne le rejoindre dans les coulisses. Cela élimine la nécessité de la base de données jointure croisée au sein de lui-même drupal.

En plus d'utiliser le préfixe dans le tour settings.php noté devant moi, vous pouvez également hardcode le préfixe dans la chaîne de requête que vous passez à db_query () (semblable à ce que vous avez fait dans votre question).

Donc, dans ce cas, vous auriez

drupal.node inner join old_data_source.page on blablabla

Testé sur d7.

Bien sûr l'utilisateur que vous utilisez dans l'argument db_set_active doit avoir accès aux deux bases de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top