Durante la elaboración de un proyecto Drupal para el cual tenía que integrar datos que se encontraban en otro sistema (sin Drupal pero con Mysql) tenía dos soluciones: importar estos datos en el sistema Drupal, en nodos con FeedApi y Feed Element Mapper, o integrarlos directamente el proceso de Drupal para crear las páginas, los bloques o las vistas pero sin generar nuevas tablas en mi base de datos Drupal.
Si la primera solución parece la más simple y la más estándar, tiene sin embargo varios inconvenientes. Primero debemos duplicar los datos entre el sistema externo y el sistema Drupal, lo que puede provocar problemas de inconsistencia cuando los datos se modifican en uno de los dos sistemas. Segundo, si el volumen de producción de datos en el sistema externo es importante, en mi caso se trata de más de 1500 registros al día, debemos enfrentar un problema de escalabilidad en Drupal, lo que implica una configuración más avanzada y por lo tanto un costo adicional.
Decidí entonces tomar la segunda solución, integrar estos datos en el proceso de creación de página pero sin importarlos y sin crear tablas adicionales. Por ello necesitaba acceder a la base de datos del sistema externo desde Drupal.
En realidad acceder a una base de datos externa desde Drupal es bastante simple, basta definir una nueva conexión hacía dicha base de datos y cambiar de conexión cuando sea necesario.
Definir nuevas conexiones
Por defecto, Drupal utiliza la base de datos definida en el archivo default/setting.php gracias a la variable global $db_url (), como sigue:
<?php
$db_url = 'mysql://user:passw@localhost/drupal _bd';
?>En este caso, Drupal utilizará la BD llamada 'drupal _db', sobre la cual el usuario 'user' con la contraseña 'passw' tiene todos los derechos.
Podríamos también utilizar lo siguiente, lo que nos dará el mismo resultado:
<?php
$db_url['default'] = 'mysql://user:passw@localhost/drupal _bd';
?>Ya lo han entendido, es aquí que vamos a añadir una nueva conexión hacía otra base de datos.
<?php
// Conexión por defecto de Drupal
$db_url['default'] = 'mysql://user:passw@localhost/drupal _bd';
// Nuevas conexiones a otras BD externos
$db_url['new'] = 'mysql:// newuser:newpassw@localhost/new _bd' ;
$db_url['db2'] = 'mysql://otheruser:passw2@localhost/other _bd' ;
?>A partir de este momento, Drupal dispondrá de tres conexiones, 'default', 'new' y 'db2', hacía tres bases de datos distintas: 'drupal _bd',' new _bd',' other _bd'. Por defecto Drupal utilizará siempre la conexión definida por la variable $db_url['default']
Cambiar de conexión
Para cambiar de conexión y enviar una consulta hacía una otra base de datos, utilizaremos función db_set_active()
<?php
// Conectarse a otra BD, en este caso other _bd
db_set_active('db2');
// Enviar la consulta
$result=db_query('select idregistro from table_in_ other _bd where idregistro<>0 order by idregistro');
// recuperar el resultado
while ( $obj = db_fetch_object ($result) ) {
…
}
// ¡OJO ! Volver a conectarse a la BD por defecto de Drupal
db_set_active('default');
?>No se olvide de volver a conectarse a la base de datos por defecto de Drupal al finalizar el proceso, sino Drupal hará todas sus consultas hacía la BD externa, lo que nos llevaría a un error.
Podríamos también poner el resultado de la consulta directamente en el cache de Drupal, pero abordaremos esto en un próximo artículo.
Debido a que el “database abstraction layer” de Drupal utiliza los mismos nombre de función para cada base de datos, no podemos recurrir simultáneamente a distintos sistemas de gestión de base de datos, como Mysql y PostgreSQL al mismo tiempo. Si realmente lo necesita, puede consultar este artículo para más información: http://drupal.org/node/19522
Conclusión
Hemos visto lo simple que es de conectarse a otra base de datos desde Drupal. En el caso que me interesaba, esta solución fue mucho más eficiente en cuanto a rendimiento pero requiere un poco más de programación. Pero conoce un programador a quien no le apasiona programar?
Referencias:
$db_url ()
Variables globales
db_set_active()
Database abstraction layer
How to connect to multiple databases within Drupal



Comentarios
Conexion a sql server remoto
Hola de que manera puedo tener una conexion a un sql server remoto para ejecutar algunos stored procedures?, la db principal es mysql y esta ubicada localmente al sitio web. pero Necesito poder acceder al sql server para recuperar unos listados.
Busque en la web pero la verdad que las soluciones planteadas no las pude implementar en drupal 7, ya que me confunden un poco al parecer no pueden haber conexiones simultaneas a diferentes motores de base de datos. Sinceramente no me deja muy en claro la informacion encontrada.
Desde ya agradeceria cualquier aporte.
Saludos.
Coneccion con Bases de datos
Que bueno seria un modulo para conectar bases de datos de multisitios...
Gracias y me gustaría saber mas sobre como hacer las consultas mediante views, o que me sugieran algún articulo o tutorial. Estoy trabajando en un proyecto que lo necesita. Un saludo desde Argentina.
Hola a todos muy bueno este
Hola a todos
muy bueno este manual pero tengo una duda, ese codigo php,como lo pones en drupal existe algun modulo que te permite introducir codigo...
Modulo
Generalmente, para llamar a otra base de datos, lo haces en un módulo propio o custom. :)
hola Karim Boudjema gracias
hola Karim Boudjema gracias por responderme, pero podrias explicarte mucho mejor, este modulo que dices que opciones me brinda, es decir puedo realizar consultas a mi base de datos y poner el resultado en la pagina.
gracias
espero me ayuden
hola espero que esten en linea una pregunta que ventajas y desventajas tiene el trabajar con dos base de datos para un sistema de escritorio .
muchas gracias
$db_prefix
Yo tengo dos bases de datos distintas y distitos prefijos para la tablas, como le indico el prefijo para cada base de datos?
gracias
Buenas, interesante el tema,
Buenas, interesante el tema, pero se podría hacer algo para redireccionar de algun modo las tablas de cache de drupal a otra base de datos?
muy bueno
Muy bueno este post, voy a ponerlo en mi web con tu referencia si me das permiso, ya que en ella estoy intentando recapitular toda la información que me interesa para poder aceder a ella y seguir aprendiendo cosas nuevas.
Por supuesto
Por supuesto que puedes incluirlo en tu web, siempre y cuando hagas referencia a webenstock.com
Soy nuevo en drupal. ¿Podrías
Soy nuevo en drupal. ¿Podrías ayudarme? Construí una base datos innodb en mysql. Funciona bien y ya tiene varios registros cargados. Lo que yo quiero hacer es usar esa base de datos con drupal. ¿Este tutorial es lo que necesito? ¿Hay que usar algún módulo raro para usar innodb? Necesito que sea innodb sí o sí. Muchas gracias.
Es lo mismo
Hola Gaston,
Para usar tablas en Innodb no se requiere ninguna configuración particular y ningún módulo en particular. Puedes seguir las instrucciones de este post sin problemas
Saludos
Fuiste muy amable. Muchas
Fuiste muy amable. Muchas gracias!
setting.php
las nuevas conexiones se escriben en setting.php o en el lugar donde queremos usarlas?
Claro, en settings.php
Hola Fran,
Las nuevas conexiones se definen en sites/default/settings.php como sigue:
<?php//......
// Conexión por defecto de Drupal
$db_url['default'] = 'mysql://user:passw@localhost/drupal _bd';
// Nuevas conexiones a otras BD externos
$db_url['new'] = 'mysql:// newuser:newpassw@localhost/new _bd' ;
$db_url['db2'] = 'mysql://otheruser:passw2@localhost/other _bd' ;
?>
Saludos
Muy interesante. A mi me
Muy interesante. A mi me sirven mas ejemplos concretos como este caso que no mil paginas de un manual.
Un saludo
Enviar un comentario nuevo