Frage

Ist es möglich, Quer Datenbank zu tun, schließt sich in Drupal?

Sagen Sie, haben Sie zwei Datenbanken, drupal und old_data_source. Sie wollen drupal.node zu old_data_source.page beizutreten.

db_set_active() kann aufgerufen werden, um mehrere Datenbanken zu verwenden. Allerdings kann nicht alles über Kreuz Datenbanktabelle finden verbindet!

(Ich suche in diesen als Teil eines Migrationsscript und old_data_source werden zu entfernen)

War es hilfreich?

Lösung

Drupal unterstützt nicht zu einem Zeitpunkt mehr als eine aktive Datenbank mit. Hauptgrund dafür ist wahrscheinlich, dass dies eine mysql spezifische Funktion.

Sie können dies tun mit php und überspringen die Drupal Datenbank-Ebene. Da es nur für ein Migrationsscript ist, die einmal ausgeführt werden sollen, wird es in Ordnung sein, um die Code-Datenbank spezifische zu machen. Sprechen Sie uns mysql_ connect usw. Wahrscheinlich eine gute Idee, mit beenden db_set_active

Andere Tipps

Es ist ein wenig bekannter Trick, um dies zu erreichen, die auf einem Feature basiert Tabelle Vorfixierung genannt. Sie können Ihre settings.php Präfix bestimmte Tabellen in Ihren Abfragen mit dem Namen einer anderen Datenbank konfigurieren, so dass Sie tun können, Cross-Datenbank verbindet.

Haben Sie einen Blick auf die Beispiele in den Kommentaren der default.settings.php (ähnliche Syntax gilt in Drupal 6), um zu sehen, wie diese einzurichten. Im Fall der ursprünglichen Frage, würden Sie einen Präfix-Array auf Ihrem Standard $ Datenbanken Eintrag haben, das aussieht wie:

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

Und dann baut eine Abfrage mit so etwas wie:

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

Die Abstraktion Drupal DB-Schicht interpretiert die {page} und wandelt es in SQL wie:

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

Die einzige andere Sache, um sicherzustellen ist, dass der Datenbankbenutzer im Zusammenhang mit Ihrem Standard-Drupal-Datenbank Berechtigungen für den Zugriff hat beiden Datenbanken oder diesen Trick funktioniert nicht.

Ich möchte nur auf diese Antwort schreiben, weil ich dieses Problem selbst vor kurzem konfrontiert. Die einfachste Lösung mit Abstand (in meinem Fall) war eine MySQL Ansicht zu schaffen, dass schloß sich die hinter den Kulissen. Dadurch entfällt die Notwendigkeit, dass die Quer Datenbank innerhalb Drupal selbst.

Neben der Verwendung des Präfix in settings.php Trick vor mir erwähnt, können Sie auch das Präfix in die Query-String codieren, dass Sie db_query () übergeben (ähnlich dem, was Sie in Ihrer Frage haben).

Also in diesem Fall müßten Sie

drupal.node inner join old_data_source.page on blablabla

Getestet auf d7.

Natürlich ist der Benutzer Sie im db_set_active Argumente hat Zugriff auf beiden Datenbanken haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top