Pregunta

¿Es posible hacer la base de datos cruzada se une en Drupal?

Supongamos que tiene dos bases de datos, y drupal old_data_source. Quiere unirse a drupal.node old_data_source.page.

db_set_active() puede ser llamado a utilizar varias bases de datos. Sin embargo no se puede encontrar nada sobre la tabla de base de datos cruzada se une!

(estoy investigando esto como parte de un script de migración y será la eliminación de old_data_source)

¿Fue útil?

Solución

Drupal no soporta tener más de una base de datos activa a la vez. La razón principal es probablemente que esta es una característica específica de MySQL.

Se puede hacer esto con php y omitir la capa de base de datos de Drupal. Ya que es sólo por un script de migración que se deben ejecutar una vez, no habrá ningún problema para hacer la base de datos específica de código. Sólo nos mysql_ connect etc. probablemente sería una buena idea terminar usando db_set_active

Otros consejos

Hay un truco poco conocido para lograr esto, que se basa en una función llamada prefijar mesa. Puede configurar su settings.php para prefijar ciertas tablas en sus consultas con el nombre de otra base de datos, por lo que se puede hacer entre bases de datos se une.

Tener un vistazo a los ejemplos en los comentarios de la default.settings.php (sintaxis similar se aplica en Drupal 6) para ver cómo configurar esto. En el caso de la pregunta original, que tendría una matriz prefijo de bases de datos en su entrada $ defecto que se parece a:

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

Y a continuación, crear una consulta con algo como:

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

La capa de abstracción de base de datos de Drupal interpretará la página {} y convertirlo en SQL como:

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

La única otra cosa para asegurarse de que es el usuario de base de datos asociada a la base de datos de Drupal su defecto tiene privilegios de acceso a ambas bases de datos, o este truco no funcionará.

Me gustaría añadir a esta respuesta, porque me enfrentar este problema yo recientemente. La solución más fácil es de lejos (en mi caso) era crear un mysql vista que hicieron la unión entre bastidores. Que elimina la necesidad de la base de datos cruzada se unen dentro de Drupal en sí.

Además de utilizar el prefijo de truco settings.php señalado antes que yo, también puede codificar el prefijo en la cadena de consulta que se pasa a db_query () (similar a lo que hizo en su pregunta).

Así que en este caso tendría

drupal.node inner join old_data_source.page on blablabla

Probado en d7.

Por supuesto que el usuario que está utilizando en el argumento db_set_active tiene que tener acceso a ambas bases de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top