erlang mnesia 创建表记录

 通过前一篇博已经了解了mnesia数据库如何初始化,如何启动,在这篇博客中你将了解到如何在 mnesia数据库上创建表,并且如何对创建的表进行增删改查操作。

 

  因为创建mnesia数据库过程中需要使用到erlang的record数据结构,所以得先写一个create_tables的模块来封装初始化表的操作,以下是create_tables.erl 的代码:

 

-module(create_tables).

%% ====================================================================
%% API functions
%% ====================================================================
-export([init_tables/0,insert_user/2]).

%% ====================================================================
%% Internal functions
%% ====================================================================

-record(user,{id,name}).

init_tables()->
	io:format("~p~n", [record_info(fields,user)]),
	mnesia:create_table(user, [{attributes,record_info(fields,user)}]).


insert_user(Id,Name)->
	mnesia:dirty_write(#user{id=Id,name=Name}).

      首先在文件头部需要定义一个名为user的record的数据结构用来描述用户数据结构,在init_tables 方法中

调用了mnesia:create_table/2 方法,该方法的第二个参数有其他可选参数可以填,但是在这里都是用默认值。其中最重要的两个可选参数是:持久化类型,和键值类型,默认的持久化类型是ram内存保存的,键值类型是set(键值唯一,且键值是按照hash结构存储的,如果需要键值重复,可选用bag类型或者ordered_set类型)。

       这里需要说明的是定义的user记录和表名“user”并没有绑定的关系,表名完全可以用另外名称。

  

       在方法体中调用了mneisa的dirty_write 方法,与这个方法对应的是write方法,一个是脏写,一个是非脏写,区别是后者写入需要在一个事务中,如果事务中的任何一个步骤失败都会导致事务回滚,而dirty_write方法不会。

 

     结下来我们就在shell中执行以下创建表的操作:

     编译create_tables 模块

c(create_tables).

create_tables:init_tables().

create_table:insert_user(123,"mozhenghua").
create_table:insert_user(122,"baisui").

 

    

   好现在我们创建了一张名字叫user的内存表,并且向表中插入了两条记录。接下来我们就可以试试查询操作了。

 mnesia:dirty_read(user,123)

 通过主键查询用户表的记录。需要说明的是在记录中的第一个属性是作为表的主键索引存储的。

 

    如果不是是要通过name来查询用户记录的话,可以使用dirty_select/2 方法,通过使用带匹配规范的select来进行查询,这是一种更灵活的查询方法,这个东西极其复杂,好在进行简单的查询还是简洁明了。

可以使用这样的规范来进行查询:

mnesia:dirty_select(user,[{MatchHead.[Guard],[Result]}]).

    MatchHead: 是一个erlang的项式样,用于描述查询模式,

    Guard:是一个结果结合过滤器

    Result:用以描述查询结果的格式

 

    例如现在要查询 name为“baisui”的记录,可以这么写:

mnesia:dirty_select(user, [{#user{id='_',name="baisui"},[],['$_']}]).

    这个条件式初看起来比较晦涩难懂,且听我的分析  ‘_’ 的意思是配所有所有结果,这个写法只能出现在MatchHead中。

    ['$_'] 这个的意思是结果是要得到一整条user记录。

 

   如果在结果中只需要得到id字段,那查询逻辑可以这样写:

   mnesia:dirty_select(user, [{#user{id='$1',name="baisui"},[],['$1']}]).

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值