初始化工作:
1、(可选)启动Erlang时,设置根目录的位置:
erl -mnesia dir Dir
用你要存储schema的目录来代替Dir。
示例:
erl -mnesia dir '"db"'
2、建立schema:
mnesia:create_schema(DiscNodes) -> ok | {error, Reason}
官方文档:http://www.erlang.org/doc/man/mnesia.html#create_schema-1
关于schema的更多细节,参考《Erlang Programming》第295页 Configuring Mnesia
注:创建数据库时,建立schema操作,仅需要执行一次。
3、启动数据库
mnesia:start() -> ok | {error, Reason}
创建表:
1、声明record
Mnesia数据库表,包含Erlang的record。通常情况,record类型名就是表名。
示例:
-record(users, {username, password}).
声明record,用于创建表“users”,存储用户名“”和密码“password”。
2、创建表
mnesia:create_table(Name, TabDef) -> {atomic, ok} | {aborted, Reason}
该函数根据TabDef创建一个名为Name的表。Name为record类型,TabDef为一个元组列表,格式为{Key, Value}。
更多细节,参考官方文档:http://www.erlang.org/doc/man/mnesia.html#create_table-2
示例:
mnesia:create_table(users, [{attributes, record_info(fields, users)}]).
C:
使用事务,在数据表中添加一条数据项:
c(Id, Username, Password) -> User = #users{id = Id, username = Username, password = Password}, Fun = fun() -> mnesia:write(User) end, mnesia:transaction(Fun).
R:
使用事务,查询数据表:
r(Id) -> Fun = fun() -> qlc:e(qlc:q([User || User <- mnesia:table(users), User#users.id =:= Id])) end, mnesia:transaction(Fun).
注:使用qlc模块查询,需要在文件顶部声明“-include_lib("stdlib/include/qlc.hrl").”,否则编译时会产生“Warning: qlc:q/1 called, but "qlc.hrl" not included”的警告。
U:
记录的第一个属性为主键。
数据表的默认类型是“set”。在一个集合(set)里,所有的记录有唯一的键,在一个包(bag)里,几条数据可能有相同的键,但是记录的内容是唯一的。
如果一个不唯一的数据被存储到原有的表中,冲突的记录会被简单的覆盖 。
D:
使用事务,删除数据项:
d(Id) -> Fun = fun() -> mnesia:delete({users, Id}) end, mnesia:transaction(Fun).
脏操作:
1、速度大约10倍快于事务操作;
2、偶尔脏读,避免脏写。
可视化工具:
Erlang自带一个可以看Mnesia和ETS表查看器,使用tv:start()启动。