You are here

2 创建数据库表

admin 的头像
Submitted by admin on 星期一, 2015-06-15 02:17

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

Drupal在安装过程中,一般将数据库表的创建,委托给drupal_install_schema()函数;而drupal_install_schema()负责从模块的schema钩子中获取模式定义,转换为具体数据库上的语法,最后创建相应的表结构。我们回顾一下,第二章中,我们创建的模式:

 

/**

 * Implements hook_schema().

 */

function block_morelink_schema() {

  $schema['block_morelink'] = array(

    'description' => 'Stores more link path.',

    'fields' => array(

      'module' => array(

        'type' => 'varchar',

        'length' => 64,

        'not null' => TRUE,

        'description' => "The block's origin module, from {block}.module.",

      ),

      'delta' => array(

        'type' => 'varchar',

        'length' => 32,

        'not null' => TRUE,

        'description' => "The block's unique delta within module, from {block}.delta.",

      ),

      'url' => array(

        'type' => 'varchar',

        'length' => 255,

        'not null' => TRUE,

        'description' => "The more link url of a block.",

      ),

      'title' => array(

        'type' => 'varchar',

        'length' => 255,

        'not null' => TRUE,

        'description' => "The more link title of a block.",

      ),

    ),

    'primary key' => array('module', 'delta', 'url', 'title'),

    'indexes' => array(

      'url' => array('url'),

    ),

  );

  return $schema;

}

 

 

这个模式定义描述了block_morelink表,它包含4个varchar类型的字段。它还定义了一个联合主键,为url定义了一个普通索引。注意,在字段描述中,引用另一个表中的字段时,需要为其使用花括号。这样模式模块(参看下一节)可以为表的描述构建方便的超链接。

 

    hook_schema为模块定义的每一个数据库表,返回一个带有键的数组。在该数组中,可以使用以下键:

· 'description':一个纯文本字符串,用来描述这个表及其目的。如果这里引用了其它表,那么需要将其放在花括号中。例如,node_revisions表的描述字段包含“为每一个{node},存储每个修订本的标题和正文”。

· 'fields':一个关联数组,用来描述数据库表的列。它的定义仍然是一个关联数组,里面可以使用以下参数:

· 'description': 一个纯文本字符串,用来描述这个字段及其目的。如果这里引用了其它表,那么需要将其放在花括号中。例如,节点表的vid字段的描述包括“总是为这个字段保存最大的(最新的){node_revision}.vid的值”。

· 'type': 通用的数据类型有:'char' 'varchar' 'text''blob''int' 'float' 'numeric' 'serial'。大多数类型会映射到对应数据库引擎上的具体数据库类型。对于自增字段,需要使用'serial'。在MySQL上,这就会转换为'INT auto_increment'

· 'mysql_type', 'pgsql_type', 'sqlite_type',等等:如果你需要的类型,没有包含在前面所列的内置支持的数据类型列表中,那么你可以为每个后台的数据库指定一个类型。在这种情况下,你就用不到type参数了,但是你需要注意,对于有些数据库,如果你没有单独为其指定可用的类型,那么你的模式在该类型的数据库上将无法运行。可行的解决办法是使用"text"类型作为一个回退。

· 'serialize':一个布尔值,用来指示该字段是否将存储为序列化的字符串。 

· 'size':数据的大小,可选值有:'tiny''small''medium''normal''big'。这个用来提示该字段可以存储的最大值,以及用来判定将会使用数据库引擎的哪个具体的数据类型;例如,MySQL上,TINYINT vs. INT vs. BIGINT。默认为'normal',表示选择基础类型,比如,在MySQL上,INTVARCHAR BLOB等等。不是所有的大小,都适用于所有的数据类型。对于可用的联合情况,可参看DatabaseSchema::getFieldTypeMap()

· 'not null':如果为true,那么在这个数据库中,就不允许存在NULL值;默认为false

· 'default':字段的默认值。这里区别PHP的类型:'', '0',  0表示不同含义。如果你为一个'int'类型的字段指定默认值为'0',此时它将不能正常工作,因为这里的'0'是一个字符串,而不是一个整数。

· 'length': 'char''varchar' 'text'字段类型的最大长度。对于其它字段类型,将忽略这个参数。

· 'unsigned':布尔值,用来指示'int' 'float''numeric'类型的字段是否可以包含符号。默认为FALSE。对于其它字段类型,将忽略这个参数。

· 'precision', 'scale':用于'numeric'类型的字段,用来表示数字的精度和保留的小数位数。这两个值都是必须的。对于其它字段类型,将忽略这两个参数。

    对于所有的类型,只有'type'是必须的,其它是可选的;对于'numeric'类型,除了'type'是必须的以外,'precision''scale'也是必须的。

· 'primary key':一个数组,里面包含一个或多个字段的键名,用来表示数据库表的主键。

· 'unique keys':包含唯一键的关联数组。它里面包含一个或多个字段的键名,用来表示数据库表的唯一键。

· 'foreign keys': 表关联的关联数组。它里面包含被引用表的名字,和一个包含对应列的数组。对应列的定义使用键值对的形式('source_column' => 'referenced_column')。

· 'indexes': 包含索引的关联数组。它里面包含一个或多个字段的键名,用来表示数据库表的一个索引。

 


Drupal版本: