Domanda

E 'possibile fare banca dati croce si unisce in Drupal?

dire che avete due database, drupal e old_data_source. Vuoi unirti a drupal.node old_data_source.page.

db_set_active() può essere chiamato ad utilizzare più database. Tuttavia non riesce a trovare nulla di tabella del database croce si unisce!

(sto cercando in questo come parte di uno script di migrazione e verrà rimozione old_data_source)

È stato utile?

Soluzione

Drupal non supporta avere più di un database attivo alla volta. Motivo principale è probabilmente che questa è una caratteristica specifica mysql.

Si può fare questo con PHP e saltare il livello di database Drupal. Dal momento che è solo per uno script di migrazione che deve essere eseguito una sola volta, sarà bene per rendere la specifica database dei codici. Basta mysql_ connect ecc probabilmente una buona idea per terminare con db_set_active

Altri suggerimenti

C'è un trucco poco conosciuto per raggiungere questo obiettivo, che si basa su una funzione chiamata tavolo prefisso di. È possibile configurare il settings.php anteporre alcune tabelle nelle query con il nome di un altro database, in modo da poter fare tra database unisce.

Date un'occhiata agli esempi nei commenti della default.settings.php (sintassi simile si applica in Drupal 6) per vedere come impostare questa funzione. Nel caso della domanda iniziale, si avrebbe una matrice prefisso sulla voce di $ database di default che appare come:

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

E poi costruire una query con qualcosa di simile:

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

Il livello di astrazione Drupal DB interpreterà il {page} e convertirlo in SQL come:

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

L'unica altra cosa per fare certi è che l'utente del database associato con il database predefinito Drupal ha privilegi per l'accesso entrambi i database, o questo trucco non funzionerà.

Vorrei solo aggiungere a questa risposta, perché ho affrontato questo problema io stesso di recente. La soluzione più semplice di gran lunga (nel mio caso) era quello di creare un mysql vista che ha fatto il join dietro le quinte. Che elimina la necessità per il database croce si uniscono all'interno di Drupal sé.

Oltre a utilizzare il prefisso di trucco settings.php notato prima di me, si può anche hardcode il prefisso nella stringa di query che si passa a db_query () (simile a quello che hai fatto nella tua domanda).

Quindi, in questo caso si avrebbe

drupal.node inner join old_data_source.page on blablabla

Testato su d7.

Naturalmente l'utente che si sta utilizzando nell'argomento db_set_active deve avere accesso a entrambi i database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top