martes, 1 de diciembre de 2015

Alternando bases de datos sobre CodeIgniter

En este artículo mostraré como conectar manualmente a una base de datos, lo que resulta útil por ejemplo cuando se desea alternar entre dos o más bases de datos en una misma aplicación web.

Como es conocido, en el fichero application/config/database.php se especifica el nombre de la BD a la que nos conectaremos y la conexión se hará automáticamente. Pero hay situaciones en las que es posible desear manipular más de una base de datos, por ejemplo supongamos que se tienen dos sitios, uno de administración y otro con el contenido público, y que en determinado momento se desea consultar la BD de administración para mostrar algo en el sitio público.

En este caso lo primero sería modificar el fichero database.php de configuración y adicionar un nuevo grupo (o tantos como se desee), de la siguiente manera:

   1: $active_group = 'public';
   2: $active_record = TRUE;
   3:  
   4: $db['public']['hostname'] = 'localhost';
   5: $db['public']['username'] = 'root';
   6: $db['public']['password'] = '';
   7: $db['public']['database'] = 'my_public_db';
   8: $db['public']['dbdriver'] = 'mysql';
   9: $db['public']['dbprefix'] = '';
  10: $db['public']['pconnect'] = TRUE;
  11: $db['public']['db_debug'] = TRUE;
  12: $db['public']['cache_on'] = FALSE;
  13: $db['public']['cachedir'] = '';
  14: $db['public']['char_set'] = 'utf8';
  15: $db['public']['dbcollat'] = 'utf8_general_ci';
  16: $db['public']['swap_pre'] = '';
  17: $db['public']['autoinit'] = TRUE;
  18: $db['public']['stricton'] = FALSE;
  19:  
  20:  
  21: $db['admin']['hostname'] = 'localhost';
  22: $db['admin']['username'] = 'root';
  23: $db['admin']['password'] = '';
  24: $db['admin']['database'] = 'my_admin_db';
  25: $db['admin']['dbdriver'] = 'mysql';
  26: $db['admin']['dbprefix'] = '';
  27: $db['admin']['pconnect'] = TRUE;
  28: $db['admin']['db_debug'] = TRUE;
  29: $db['admin']['cache_on'] = FALSE;
  30: $db['admin']['cachedir'] = '';
  31: $db['admin']['char_set'] = 'utf8';
  32: $db['admin']['dbcollat'] = 'utf8_general_ci';
  33: $db['admin']['swap_pre'] = '';
  34: $db['admin']['autoinit'] = TRUE;
  35: $db['admin']['stricton'] = FALSE;

Nótese que se tienen dos grupos donde la primera llave especifica el nombre del grupo y la segunda el parámetro (por ejemplo $db['public']['database']… especifica el parámetro “nombre de base de datos” del grupo “public”). En el ejemplo de arriba he creado dos grupos, “admin” y “public”, y al inicio del código he declarado como grupo activo el public.

Automáticamente todas las consultas que se hagan en el modelo se harán sobre la BD “my_public_db” que es la activa por defecto, y se buscarán aquí las tablas, relaciones y consultas especificadas.

Ahora, la forma de cargar una BD determinada es usando la sentencia:



   1: $this->load->database('nombre_de_grupo');


Pero se puede usar de la siguiente forma:



   1: $this->db = $this->load->database(' nombre_de_grupo ', TRUE);


Donde el parámetro TRUE permite devolver el objeto DATABASE, que en este caso lo estamos guardando sobre la misma variable $this->db de CodeIgniter, así en los modelos podremos seguir utilizando esta variable transparentemente sin importar a cuál base de datos estemos conectados.

Sabiendo esto, para alternar momentáneamente entre bases de datos basta con poner a nivel de controladores algo como esto:



   1: $this->db = $this->load->database('admin', TRUE);
   2: $records = $this->my_admin_model->get_example_data();
   3: $this->db = $this->load->database('public', TRUE);
   4: //usar $records

En la primera línea se carga la configuración del grupo “admin” y por tanto la base de datos “my_admin_db”; en la segunda línea se consulta la misma; y en la tercera línea se restablece la configuración del grupo “public” con la base de datos “my_public_db”.

Como alternativa, se pueden conectar simultáneamente varias bases de datos, como ilustra el siguiente ejemplo de la documentación de CodeIgniter:



   1: $DB1 = $this->load->database('grupo_uno', TRUE);
   2: $DB2 = $this->load->database('grupo_dos', TRUE);

Y en lugar de usar el objeto $this->db se usarían los objetos $DB1 y $DB2:

   1: $DB1->query();
   2: $DB1->result();
   3: etc...


Es todo, espera les sea de utilidad e interés el tema.


¿Te ha gustado este Post? Compártelo con tus amigos.

1 comentario:

  1. no me funciona, tengo cuatro base de datos (multiempresa) y siempre me toma la de defecto

    ResponderEliminar

IconIconIcon