通过前一篇博已经了解了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']}]).