当您在中创建新表时hook_schema()
,是否也应在其中添加该表hook_update_N()
?还是有一些技巧或我想念的东西来让databae-updates自动添加表?
hook_update_N()的文档没有介绍引入新表的任何内容,而的文档则hook_schema()
说:
首次启用该模块时,将自动创建此挂钩声明的表,并在卸载该模块时将其删除。
(重点是我的)
如果是这样,如何最好地避免在hook_update_N()和hook_schema()中都为新表重复架构定义。只需简单地引用以下架构:
function hook_update_N(&$sandbox) {
$schema = hook_schema();
$name = "foo";
$table = $schema["foo"];
db_create_table($name, $table);
}
似乎可行,但是如果用户运行更新并运行两个或多个hook_update_N(),则再次更改表将失败。毕竟:第一个hook_update_N将已经安装了正确的数据库,第二个hook_update_M()将尝试添加/更改/更改已经是最新的列。
您如何处理?
请参阅drupal.org/node/150215以获取文档。因此,基本上,要在安装模块后添加新表是通过hook_update_N进行的,但您也可以将表定义添加到hook_schema中,以供新用户或全新安装。总结一下,如果您进行了任何表更改以通过hook_update_N更新当前表,但是您也将更改合并到了hook_schema中。
—
junedkazi 2012年
因此,似乎没有办法避免违反DRY。可怜。
—
berkes 2012年
我一无所知。但是您可以编写一个具有模式定义的小函数,并在两个函数中调用该定义。
—
junedkazi 2012年
@berkes可以定义另一个函数,该函数返回附加模式,并在update和install挂钩中都引用它。
—
user1359