随笔 - 65  文章 - 0  评论 - 21  阅读 - 32万

【Erlang新手成长日记】Mnesia数据库CRUD操作

初始化工作:

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()启动。

posted on   Anthony Li  阅读(2315)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2012年9月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6

博客园博客已停止更新,博客地址:dyinigbleed.com

点击右上角即可分享
微信分享提示