hook_schema no está creando una tabla de base de datos

12

La siguiente función está contenida en process_login.install como parte de un módulo personalizado llamado process_login. El módulo funciona si creé manualmente la tabla de la base de datos, pero naturalmente me gustaría que la tabla se creara automáticamente en la instalación.

La función en sí no genera un error de esquema al instalar el módulo. Pero tampoco crea la tabla de base de datos process_login_register en la base de datos Drupal 7 MySQL.

No hay otros errores que pueda ver o problemas informados por Site Report.

Lo eliminé por completo y lo reinstalé varias veces. He buscado mucho en la web y consultado dos libros que tengo sobre el desarrollo de Drupal. No puedo ver nada malo con esta función (se enumera a continuación).

NOTA: También he intentado definir 'id' como serial pero obtengo el mismo resultado (es decir, no se ha creado ninguna tabla).

Me he quedado sin ideas. ¿Alguien sabe por qué esta función no funciona?

function process_login_schema(){
  $schema['process_login_register'] = array(
        'description' => 'Register a specific computer with the system.',
        'fields' => array(
                'id' => array(
                    'description' => 'Primary identifier.',
                    'type' => 'int',
                    'unsigned' => TRUE,
                    'size' => 'normal',
                    'not null' => TRUE,
                    'default' => 0,
                ),
                'ip' => array(
                        'description' => "The user's IP address at registration.",
                        'type' => 'varchar',
                        'length' => 32,
                        'not null' => TRUE,
                        'default' => '',
                ),
                'user_agent' => array(
                        'description' => "The user's browser user agent string at registration.",
                        'type' => 'varchar',
                        'length' => 255,
                        'not null' => TRUE,
                        'default' => '',
                ),
        ),
        'primary key' => array('id'),
  );
  return $schema;
}
usuario8109
fuente
¿Qué versión de Drupal estás usando?
googletorp
3
¿Realmente desinstaló y reinstaló (no solo deshabilitó y volvió a habilitar) el módulo desde que escribió la función?
Clive
Drupal 6 requiere llamar a drupal_install_schema () en hook_install. En Drupal 7 se recomienda no llamarlo explícitamente.
Shoaib Nawaz
Respuestas a lo anterior: Drupal 7. Sí. Estoy usando Drupal 7, así que no llamo a drupal_install_schema ().
user8109
1
@ user8109 Habilitar / deshabilitar e instalar / desinstalar son dos cosas completamente diferentes en los módulos. Habilitar un módulo (verificándolo en la página de módulos y presionando 'Enviar') solo habilitará un módulo e invocará hook_enable(). La instalación de un módulo solo se puede hacer después de que se haya desinstalado (usando la pestaña de desinstalación o devel / reinstalar), después de lo cual se eliminan todas las tablas creadas por el módulo. Cuando instala el módulo, hook_install()se ejecuta como era de esperar
Clive

Respuestas:

22

Uso drush dre -y [module]que deshabilita, desinstala y luego vuelve a habilitar el módulo. La -ybandera lo hace aún más rápido, evitando que tengas que presionar y entrar tres veces.

bloke_zero
fuente
16

Solo si desinstala un módulo y luego lo vuelve a instalar, las tablas de la base de datos que usa y declara hook_schema()se vuelven a crear.

Para desinstalar un módulo, debe:

  • Desmarque la casilla de verificación que se muestra para el módulo

    captura de pantalla

  • Haga clic en Guardar configuración

    captura de pantalla

  • Haga clic en la pestaña: Desinstalar_

  • Haga clic en la casilla de verificación a la izquierda del nombre del módulo
  • Haga clic en el botón Desinstalar

    captura de pantalla

  • En la página siguiente, confirme que desea desinstalar ese módulo haciendo clic en el botón Desinstalar

    captura de pantalla

Como alternativa, si ha instalado Drush, puede usar los siguientes comandos.

drush pm-disable $module
drush pm-install $module
drush en $module

Reemplace $modulecon el nombre corto del módulo, entre los vértices y sin la extensión .module.

Lo que ha hecho es deshabilitar el módulo y luego volver a habilitarlo. Incluso si eliminó el directorio que contiene el módulo, para Drupal lo que ha hecho es simplemente deshabilitarlo y luego volverlo a habilitar.

kiamlaluno
fuente
¿Es posible hacer esto usando drupal_install_schema y drupal_uninstall_schema .... drupal.org/node/876250
Hitesh