现在的位置: 首页 > 综合 > 正文

erlang mnesia

2013年04月06日 ⁄ 综合 ⁄ 共 2733字 ⁄ 字号 评论关闭

3、建造Mnesia数据库

3.1 定义数据库结构

3.1.1 与数据库结构相关的函数

● mnesia:create_schema(NodeList). 

用于初始化新建的空白的结构。它必须在Mnesia启动前调用。

● mnesia:delete_schema(DiscNodeList). 

它清除在列表DiscNodeList中的全部节点上的已有数据库结构及其数据表格。它调用前必须在全部db_nodes上停用Mnesia。 

● mnesia:delete_table(Tab). 

永久删除表格Tab的复制品。

● mnesia:clear_table(Tab). 

永久删除表格Tab的内容。

● mnesia:move_table_copy(Tab, From, To). 

把表格Tab的复制品,从节点From移至节点To。

● mnesia:add_table_copy(Tab, Node, Type). 

在节点Node创建表格Tab的复制品。

● mnesia:del_table_copy(Tab, Node). 

在节点Node删除表格Tab的复制品。

● mnesia:transform_table(Tab, Fun, NewAttributeList, NewRecordName). 

改变表格Tab中定义的记录格式。参数Fun表示处理表中全部记录的函数。

-record(old, {key, val}).

-record(new, {key, val, extra}). 

Transformer = 

   fun(X) when record(X, old) ->

      #new{key = X#old.key,

           val = X#old.val,

           extra = 42}

   end,

{atomic, ok} = mnesia:transform_table(foo, Transformer, 

                                      record_info(fields, new), 

                                      new),

● change_table_copy_type(Tab, Node, ToType). 

改变表格的存储类型。例如,在节点Node上,内存表格RAM改为硬盘表格disc_table。

3.2 数据模型

Mnesia的数据模型是扩展的关系数据模型。数据组成表格的集合,数据记录之间的关系,可由表格间的关系模型描述。表格内容是Erlang记录的实例,记录由Erlang元组的形式表示。

3.3 启动Mnesia

启动Mnesia之前,必须初始化各相关节点上的数据库结构为空白。

● Erlang系统必须启动;

● 必须用函数create_schema(NodeList),在硬盘数据库相关节点上,定义数据库结构。

3.3.1 初始化数据库结构,启动Mnesia

我们以上述数据库Company为例:

%erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'

初始化数据库:

dist_init() ->

    mnesia:create_table(employee,

                         [{ram_copies, [a@gin, b@skeppet]},

                          {attributes, record_info(fields,

                                                   employee)}]),

    mnesia:create_table(dept,

                         [{ram_copies, [a@gin, b@skeppet]},

                          {attributes, record_info(fields, dept)}]),

    mnesia:create_table(project,

                         [{ram_copies, [a@gin, b@skeppet]},

                          {attributes, record_info(fields, project)}]),

    mnesia:create_table(manager, [{type, bag}, 

                                  {ram_copies, [a@gin, b@skeppet]},

                                  {attributes, record_info(fields,

                                                           manager)}]),

    mnesia:create_table(at_dep,

                         [{ram_copies, [a@gin, b@skeppet]},

                          {attributes, record_info(fields, at_dep)}]),

    mnesia:create_table(in_proj,

                        [{type, bag}, 

                         {ram_copies, [a@gin, b@skeppet]},

                         {attributes, record_info(fields, in_proj)}]).

函数 mnesia:stop() 在本地节点上停止 Mnesia。函数 start/0 和 stop/0 工作在本地 Mnesia 系统上。

3.3.2 启动顺序

Mnesia 的启动函数是:

          mnesia:start().

它初始化本地的 DBMS。

不同的配置会改变表格位置和装入顺序。

函数mnesia:wait_for_tables(TabList, Timeout) 推迟对表格的访问,直到TabList中指定的表格做了适当初始化。

下面的函数可以把硬盘上的全部表格快速装入内存:

mnesia:force_load_table(Tab). 

3.4 创建新表格

mnesia:create_table(Name, ArgList). 

函数执行后的返回信息:

{atomic, ok} 函数成功执行

{aborted, Reason} 执行失败

函数的参数:

Name 是表格的原子名称。

ArgList 是列表,表成员是 {Key,Value} 元组。

假设有个记录的定义:

      -record(funky, {x, y}).

下面创建表格,要在2个节点上复制,在属性y上有附加索引,并且是个类型包(type bag)。

      mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index,

      [y]}, {type, bag}, {attributes, record_info(fields, funky)}]).

 

 

抱歉!评论已关闭.