hook_schema没有创建数据库表


12

以下功能作为名为process_login的自定义模块的一部分包含在process_login.install中。如果手动创建数据库表,该模块将起作用,但是自然地,我希望在安装时自动创建该表。

该函数本身在安装模块时不会生成架构错误。但是它也没有在Drupal 7 MySQL数据库中创建数据库表process_login_register。

我没有看到其他错误,也没有网站报告报告的问题。

我已将其完全删除并重新安装了无数次。我在网络上进行了广泛搜索,并查阅了两本有关Drupal开发的书。我看不到此功能有什么问题(下面列出)。

注意:我也尝试将'id'定义为序列,但是得到相同的结果(即未创建表)。

我的想法已经用完了。有人知道为什么这个功能不能正常工作吗?

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;
}

您正在使用什么Drupal版本?
googletorp

3
自编写功能以来,您是否实际卸载并重新安装了模块(不仅仅是禁用并重新启用了该模块)?
克莱夫(Clive)

Drupal 6需要在hook_install中调用drupal_install_schema()。在Drupal 7中,建议不要显式调用它。
Shoaib Nawaz 2012年

上面的答案:Drupal 7.是的。我正在使用Drupal 7,所以不调用drupal_install_schema()。
user8109 2012年

1
@ user8109启用/禁用和安装/卸载是模块中完全不同的两件事。启用模块(在模块页面中选中它,然后按“提交”)将仅启用一个模块,然后调用hook_enable()。只有在卸载模块后(使用“卸载”选项卡或devel / reinstall),然后再删除该模块创建的所有表之后,才能安装模块。然后,当您安装模块时,hook_install()将按预期运行
Clive

Answers:


22

使用drush dre -y [module]禁用,卸载然后重新启用模块。该-y标志使速度更快,避免了您必须按y并输入3次的情况。


16

仅当卸载模块并随后重新安装模块时,hook_schema()才会重新创建使用该模块并声明的数据库表。

要卸载模块,您需要:

  • 取消选中为模块显示的复选框

    屏幕截图

  • 点击保存配置

    屏幕截图

  • 单击:Uninstall_选项卡

  • 单击模块名称左侧的复选框
  • 点击卸载按钮

    屏幕截图

  • 在下一页上,单击“ 卸载”按钮确认要卸载该模块。

    屏幕截图

或者,如果您安装了Drush,则可以使用以下命令。

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

$module模块的短名称替换,在顶点之间且不带.module扩展名。

您要做的是禁用该模块,然后重新启用它。即使删除了包含模块的目录,对于Drupal而言,您所做的只是禁用然后重新启用它。


是否可以使用drupal_install_schema和drupal_uninstall_schema .... drupal.org/node/876250
Hitesh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.