维护数据库表

老葛的Drupal培训班 Think in Drupal

当你为一个模块创建新版本时,你可能需要修改数据库模式。可能,你添加了一列,或者为某一列添加了索引。由于该表已经包含了数据,所以你不能简单地删除并重建该表。下面给出了如何保证平稳的修改数据库表:
 
1. 更新你的.install文件中hook_schema()的实现,这样模块的新用户安装时,用的就是新模式了。你的.install文件中的模式定义,应该总是最新的,以反映你模块的表和字段的当前结构。
2. 通过写一个更新函数,让已有用户对现有模块进行更新。更新函数按照顺序进行命名,起始数字一般是基于Drupal版本的。例如,Drupal6的第一个更新函数可以为modulename_update_6000(),那么第二个更新函数就为modulename_update_6001()。下面是来自modules/comment/comment.install中的例子,这里向评论表中的父ID(pid)列添加了一个索引:
 
/**
 * Add index to parent ID field.
 */
function comment_update_6003() {
    $ret = array(); // Query results will be collected here.
    // $ret will be modified by reference.
    db_add_index($ret, 'comments', 'pid', array('pid'));
    return $ret;
}
 
    在更新了模块以后,用户运行http://example.com/update.php时,就会调用这个函数。
 
 
警告 因为,你每次添加一个表,字段,或者索引时,都会修改hook_schema()实现中的模式定义,所以你的更新函数千万不要使用这里的模式定义。你可以把hook_schema()实现中的模式定义看成是当前的,而把更新函数中的模式看成是过去的。参看http://drupal.org/node/150220
 
用来处理模式的函数的完整列表,可参看http://api.drupal.org/api/group/schemaapi/6
 
提示 Drupal会追踪一个模块当前所用的模式版本。这一信息存储在system表中。在运行完本节所示的更新以后,评论模块对应记录中的schema_version的值就变成了6003。为了让Drupal忘记该项,可以使用devel模块中的“Reinstall Modules”(重装模块)选项,或者从system表中删除该模块的记录。
 

Drupal版本: