hook_schema não está criando tabela de banco de dados

12

A função a seguir está contida em process_login.install como parte de um módulo customizado chamado process_login. O módulo funciona se eu criei manualmente a tabela do banco de dados, mas naturalmente gostaria que a tabela fosse criada automaticamente na instalação.

A função em si não gera um erro de esquema na instalação do módulo. Mas também não cria a tabela process_login_register do banco de dados no banco de dados MySQL do Drupal 7.

Não vejo outros erros ou problemas relatados pelo Site Report.

Eu o removi completamente e reinstalei várias vezes. Eu pesquisei bastante na web e consultei dois livros que tenho sobre o desenvolvimento do Drupal. Não consigo ver nada de errado com esta função (listada abaixo).

NOTA: Também tentei definir 'id' como serial, mas obtive o mesmo resultado (ou seja, nenhuma tabela criada).

Eu fiquei sem idéias. Alguém sabe por que essa função não está funcionando?

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;
}
user8109
fonte
Qual versão do Drupal você está usando?
googletorp
3
Você realmente desinstalou e reinstalou (e não apenas desativou e reativou) o módulo desde que gravou a função?
Clive
O Drupal 6 precisa chamar drupal_install_schema () em hook_install. No Drupal 7, é recomendável não chamá-lo explicitamente.
precisa
Respostas acima: Drupal 7. Sim. Estou usando o Drupal 7, então não chamo drupal_install_schema ().
user8109
1
@ user8109 Ativar / desativar e instalar / desinstalar são duas coisas completamente diferentes nos módulos. A ativação de um módulo (marcando-o na página de módulos e pressionando 'Enviar') ativará apenas um módulo e será invocada hook_enable(). A instalação de um módulo só pode ser feita após a desinstalação (usando a guia de desinstalação ou o desenvolvimento / reinstalação), após o qual todas as tabelas criadas pelo módulo são excluídas. Quando você instala o módulo, ele hook_install()é executado conforme o esperado
Clive

Respostas:

22

Use o drush dre -y [module]que desativa, desinstala e reativa o módulo. A -ybandeira o torna ainda mais rápido, evitando que você pressione y e insira três vezes.

bloke_zero
fonte
16

Somente se você desinstalar um módulo e reinstalá-lo posteriormente, as tabelas do banco de dados que ele usa e declara hook_schema()são recriadas.

Para desinstalar um módulo, você precisa:

  • Desmarque a caixa de seleção mostrada para o módulo

    captura de tela

  • Clique em Salvar configuração

    captura de tela

  • Clique na guia: Desinstalar_

  • Clique na caixa de seleção à esquerda do nome do módulo
  • Clique no botão Desinstalar

    captura de tela

  • Na página seguinte, confirme que você deseja desinstalar esse módulo clicando no botão Desinstalar

    captura de tela

Como alternativa, se você instalou o Drush, pode usar os seguintes comandos.

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

Substitua $modulepelo nome abreviado do módulo, entre vértices, e sem a extensão .module.

O que você fez foi desativar o módulo e, em seguida, reativá-lo. Mesmo se você excluiu o diretório que contém o módulo, para o Drupal, o que você fez é apenas desativar e depois reativá-lo.

kiamlaluno
fonte
É possível fazer isso usando drupal_install_schema e drupal_uninstall_schema .... drupal.org/node/876250
Hitesh