Marzo 26, 2014
enzo
Anteriormente ya les he hablando sobre Como crear tablas para nuestros módulos personalizados en Drupal 7 y sobre Cómo modificar el esquema de una base de datos en Drupal 7 pero que pasa si ya tenemos un modulo que esta instalado y queremos agregar una nueva tabla que este relacionado al mismo schema del modulo actualmente activo.
Por definición el hook_schema() es ejecutado al momento de activar el módulo, pero como nuestro modulo ya esta activo y des-activarlo y des-instalarlo no es una opción porque perderíamos los datos que ya se han almacenado en las tablas del módulo creadas con anterioridad.
A continuación les muestro unos trucos para lograr el objetivo.
- Agregar la definición de la tabla.
Aunque la implementación del hook_schema ya se haya ejecutado en el proceso de instalación es necesario que agreguemos la definición de nuestra nueva tabla, recuerdes que este hook retorna una arreglo de datos donde cada entrada representa una tabla, por tanto debemos agregar una nueva entrada similar a la siguiente definición.
/**
* Implements hook_schema().
*/
function etowah_content_stream_schema() {
// New table
$schema['my_new_table'] = array(
// example (partial) specification for table "node"
'description' => 'The base table for my new table.',
'fields' => array(
'nid' => array(
'description' => 'The primary identifier for a node.',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE),
'vid' => array(
'description' => 'The current {node_revision}.vid version identifier.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0),
'primary key' => array('nid'),
);
$schema['node'] = array(
// example (partial) specification for table "node"
'description' => 'The base table for nodes.',
'fields' => array(
'nid' => array(
'description' => 'The primary identifier for a node.',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE),
'vid' => array(
'description' => 'The current {node_revision}.vid version identifier.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0),
'primary key' => array('nid'),
);
return $schema;
}
Lo anterior permitirá que funciones como drupal_write_record o db_select reconozcan nuestro esquema, pero hasta ahora el esquema una no ha sido creado esto lo haremos a continuación.
- Crear la nueva tabla.
Para crear la tabla haremos uso del hook hook_update_N(), como podemos ver en el siguiente código.
/**
* Create new database table {my_new_table}.
*/
function mimodule_update_7001(&$sand) {
$schema = module_invoke('my_new_table', 'schema');
db_create_table('my_new_table', $schema['my_new_table']);
}
Para esto debemos ejecutar el proceso de update.php, para mas información sobre como ejecutarlo aquí.
Ahora si quizás ya creamos la tabla pero en medio del proceso se nos olvido un cambio adicional como modificar la llave primaria lo podemos hacer con otro hook_update_N() como se muestra en el siguiente código
/**
* Update primary index for table {my_new_table}.
*/
function mimodule_update_7002(&$sand) {
// Drop all primary keys.
db_drop_primary_key('my_new_table');
// Add primary keys.
db_add_primary_key('my_new_table', array('entity_id', 'vid'));
}
Espero que haya sido de su agrado.