Hero

Cómo ejecutar un INSERT INTO en Drupal 7

Septiembre 18, 2013

enzo
Drupal
Desarrollo de Modulos

Hola amig@s Drupaler@s

Luego de un receso en las publicaciones debido al DrupalCamp Costa Rica 2013, hoy quiero compartirle como hacer desde Drupal 7 la popular sentencia INSERT INTO basado en SELECT.

Imaginemos que tenemos una tabla llamada users, definida como se muestra a continuación.

  CREATE TABLE `users` (
   `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `first_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
   `last_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
   PRIMARY KEY (`user_id`),
  ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Ahora imaginemos que esta tabla tiene millones de registros y deseamos hacer consultas sobre los usuarios haciendo uso del operador LIKE, el cual es lento por naturaleza. Para solventar esta solución haremos una copia de esta tabla en memoria, como se muestra a continuación.

 CREATE TABLE `users_mem` (
   `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `first_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
   `last_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
   PRIMARY KEY (`user_id`),
  ) ENGINE=MEMORY DEFAULT CHARSET=latin1;

Hasta este punto todo esta bien. Sin embargo cuando el servidor se reinicie la tabla se perdería y hacer una copia de registros usando el comando INSERT INTO podría afectar el rendimiento del servidor.

Por tanto mejor crearemos una función que haga copias parciales de los registros a la tabla de memoria y esta función podría ser ejecutada desde el cron, como se muestra a continuación.

define('ROWS_IMPORT_TO_PAGE_MEMORY', 50000);

function HOOK_cron() {

	$mem_lower_limit = variable_get('mem_lower_limit', 0);
	
	
	// Build the SELECT query.
	$fields = array(
	  'user_id',
	  'first_name',
	  'last_name',
	);
	
	$query = db_select('users', 'u')
	    ->fields('p', $fields)
	    ->range($mem_lower_limit, ROWS_IMPORT_TO_PAGE_MEMORY);
	
	// Perform the insert.
	db_insert('users_mem')->from($query)->execute();
	
	variable_set('mem_lower_limit', $mem_lower_limit + WIKIPEDIA_ROWS_IMPORT_TO_PAGE_MEMORY);

}

De esta forma cada vez que se ejecute el cron, se copiaran 50 mil registros y la siguiente ocasión se continuara en el siguiente registro a copiar.

la variable mem_lower_limit debería ser puesta a cero cuando, la tabla en memoria sea destruida para iniciar el proceso de copia.

Espero que haya sido de su agrado.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.