elang mnesia 数据库操作
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明 Mnesia 数据库如何实现SQL查询,实现select / insert / update / where / order by / join / limit / delete等SQL操作。
示例中表结构的定义:
- %% 账号表结构
- -record( y_account,{ id, account, password }).
- %% 资料表结构
- -record( y_info, { id, nickname, birthday, sex }).
1、Create Table / Delete Table 操作
- %%===============================================
- %% create table y_account ( id int, account varchar(50),
- %% password varchar(50), primary key(id)) ;
- %%===============================================
- %% 使用 mnesia:create_table
- mnesia:create_table( y_account,[{attributes, record_info(fields, y_account)} ,
- {type,set}, {disc_copies, [node()]} ]).
- %%===============================================
- %% drop table y_account;
- %%===============================================
- %% 使用 mnesia:delete_table
- mnesia:delete_table(y_account) .
注:参数意义可以看文档,{type,set} 表示id作为主键,不允许id重复,如果改为 {type,bag},id可以重复,但整条记录不能重复
2、Select 查询
查询全部记录
- %%===============================================
- %% select * from y_account
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{ _ = '_' },
- Guard = [],
- Result = ['$_'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
查询部分字段的记录
- %%===============================================
- %% select id,account from y_account
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{id = '$1', account = '$2', _ = '_' },
- Guard = [],
- Result = ['$$'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([[E#y_account.id, E#y_account.account] || E <- mnesia:table(y_account)]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
3、Insert / Update 操作
mnesia是根据主键去更新记录的,如果主键不存在则插入
- %%===============================================
- %% insert into y_account (id,account,password) values(5,"xiaohong","123")
- %% on duplicate key update account="xiaohong",password="123";
- %%===============================================
- %% 使用 mnesia:write
- F = fun() ->
- Acc = #y_account{id = 5, account="xiaohong", password="123"},
- mnesia:write(Acc)
- end,
- mnesia:transaction(F).
4、Where 查询
- %%===============================================
- %% select account from y_account where id>5
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{id = '$1', account = '$2', _ = '_' },
- Guard = [{'>', '$1', 5}],
- Result = ['$2'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E#y_account.account || E <- mnesia:table(y_account), E#y_account.id>5]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
如果查找主键 key=X 的记录,还可以这样子查询:
- %%===============================================
- %% select * from y_account where id=5
- %%===============================================
- F = fun() ->
- mnesia:read({y_account,5})
- end,
- mnesia:transaction(F).
如果查找非主键 field=X 的记录,可以如下查询:
- %%===============================================
- %% select * from y_account where account='xiaomin'
- %%===============================================
- F = fun() ->
- MatchHead = #y_account{ id = '_', account = "xiaomin", password = '_' },
- Guard = [],
- Result = ['$_'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
5、Order By 查询
- %%===============================================
- %% select * from y_account order by id asc
- %%===============================================
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- qlc:e(qlc:keysort(2, Q, [{order, ascending}]))
- end,
- mnesia:transaction(F).
- %% 使用 qlc 的第二种写法
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- Order = fun(A, B) ->
- B#y_account.id > A#y_account.id
- end,
- qlc:e(qlc:sort(Q, [{order, Order}]))
- end,
- mnesia:transaction(F).
6、Join 关联表查询
- %%===============================================
- %% select y_info.* from y_account join y_info on (y_account.id = y_info.id)
- %% where y_account.account = 'xiaomin'
- %%===============================================
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([Y || X <- mnesia:table(y_account),
- X#y_account.account =:= "xiaomin",
- Y <- mnesia:table(y_info),
- X#y_account.id =:= Y#y_info.id
- ]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
7、Limit 查询
- %%===============================================
- %% select * from y_account limit 2
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{ _ = '_' },
- mnesia:select(y_account, [{MatchHead, [], ['$_']}], 2, none)
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- QC = qlc:cursor(Q),
- qlc:next_answers(QC, 2)
- end,
- mnesia:transaction(F).
8、Select count(*) 查询
- %%===============================================
- %% select count(*) from y_account
- %%===============================================
- %% 使用 mnesia:table_info
- F = fun() ->
- mnesia:table_info(y_account, size)
- end,
- mnesia:transaction(F).
9、Delete 查询
- %%===============================================
- %% delete from y_account where id=5
- %%===============================================
- %% 使用 mnesia:delete
- F = fun() ->
- mnesia:delete({y_account, 5})
- end,
- mnesia:transaction(F).
注:使用qlc模块查询,需要在文件顶部声明“-include_lib("stdlib/include/qlc.hrl").”,否则编译时会产生“Warning: qlc:q/1 called, but "qlc.hrl" not included”的警告。
elang mnesia 数据库操作相关推荐
- Python的数据库操作(Sqlalchemy)
ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系.这样,我们要操作数据库,数据库中的表 ...
- 便捷,轻巧的Groovy数据库操作
本文主要介绍Groovy对数据的CRUD操作,熟悉groovy.sql包,测试使用的数据库是H2. 1.数据库连接配置 //数据库连接配置 def db = [url:'jdbc:h2:mem:gro ...
- Django模型之数据库操作-查询
六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...
- 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)
1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名 [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...
- .ne中的控制器循环出来的数据如何显示在视图上_Web程序设计-ASP.NET MVC4数据库操作实例...
ASP.NET MVC4数据库操作实例 之前文章介绍了MVC4与Pure框架结合进行的网页设计过程中如何定义控制器.方法.模型.视图等.并使用实例进行了简单说明.本文将在此基础上进一步说明如何使用MV ...
- oracle可以面向对象吗,Jbdc助手-数据库操作面向对象的实现(oracle)
前言: 如果你对hibernate不是那样的推崇,但感觉jdbc的sqlr操作又不是那么OO的话,那么这篇文章可能给能带来或多或少的期望- 在很长的一段时间里,中总感觉应该对sql的操作来实现一种集成 ...
- yii mysql数据库操作_Yii2数据库操作常用方法小结
本文实例讲述了Yii2数据库操作常用方法.分享给大家供大家参考,具体如下: 查询: // find the customers whose primary key value is 10 $custo ...
- mfc 访问局域网mysql_数据库操作:MFC连接与MYSQL
数据库操作:MFC连接与MYSQL mysql 与MFC通常情况下都是用ODBC或者是是ADO相连接,但有点伤 我直接找网上的教程,仿照着进行连接,试了n边还是只能连接上,但无法进行如图读取,写入的操 ...
- 数据库操作(使用FMDB)
iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...
最新文章
- oracle卸载注意啥,关于oracle的安装,卸载以及其他注意事项
- HDOJ/HDU 2565 放大的X(分段思考~)
- Atlas元数据存储模型分析
- pb中将已经建好的Grid类型转为Tabular类型
- Pocket通证POKT锁仓总价值超2.1947亿美元
- The Nth Item
- 开课吧:Web前端开发三大框架的特点
- OpenGL与shader区别(三十一)
- windowsGHO镜像系统winXPwin7win8win10下载
- bootstrap模板免费下载
- 图像尺寸与图像像素、分辨率的关系
- UnityShader源码2017---学习笔记与自我拓展001
- Google浏览器任务栏图标变白
- 鼠标双击DataGridView单元格变成ComboBox
- 学习ArrayList 和 LinkedList小记【2】
- API系列(一):SMS API
- Windows10共享CentOS文件系统(Samba的使用)
- 基于android 平台的校园二手物品交易系统设计与实现
- CSS技巧之向下箭头
- 安装linux系统安装心得,安装操作系统的心得体会
热门文章
- [leetcode]Unique Paths II
- Android App性能优化总结
- b站路飞学城python课梨视频项目代码
- Asciinema终端SSH录屏神器使用
- [Linux From Scratch 作一个自己的Linux操作系统发行版本]一、环境准备
- 永久60服务器消息,魔兽世界怀旧服:永久60级已经成为了另一个游戏,这如你所愿吗?...
- vue验证手机号、密码验证码、时间、机型、图片类型等
- 鸿蒙系统安装苹果电脑,好消息!华为鸿蒙OS系统,解决了苹果、安卓系统的一大难题...
- 实验室预约管理系统大型仪器预约平台
- chrome浏览器无法找到 www.baidu.com 的 DNS 地址