[erlang] mnesia
原文地址: http://www.cnblogs.com/bluefrog/archive/2012/05/16/2504625.html
本来是项目合作的,可是你却一而再再而三的使用这招,我处理愤怒了,自己来。先学习下 mnesia 的操作先:
-module(test_mnesia).
-compile(export_all). -include_lib("stdlib/include/qlc.hrl"). %% 定义记录结构
-record(shop,{item,quantity,cost}).
-record(cost,{name,price}).
-record(design,{id,plan}). start() ->
mnesia:start(),
%% 等待表的加载
mnesia:wait_for_tables([shop,cost,design],20000). %% 初始化mnesia表结构
init() ->
mnesia:create_schema([node()]),
mnesia:start(),
%% 表创建 mnesia:create_talbe(TableName,[Args])
%% {type,Type} set,ordered_set,bag 表类型
%% {ram_copies,NodeList} NodeList每个节点都有内存备份 默认为这个{ram_copies,[node()]}
%% {disc_copies,NodeList} NodeList每个节点都有内存备份和磁盘备份
%% {disc_only_copies,NodeList} NodeList每个节点有磁盘备份
%% {attributes,AtomList} 要保存的列名称 一般和record有关 record_info(fields,RecordName)
mnesia:create_table(shop,[{attributes,record_info(fields,shop)}]), %% 创建shop表
mnesia:create_table(cost,[{attributes,record_info(fields,cost)}]),
mnesia:create_table(design,[{attributes,record_info(fields,design)}]),
mnesia:stop(). %% 加载测试数据
reset_tables() ->
mnesia:clear_table(shop),
mnesia:clear_table(cost),
F = fun() ->
lists:foreach(fun mnesia:write/1,example_tables())
end,
mnesia:transaction(F). %% 测试数据
example_tables() ->
[
%% shop table
{shop,apple,20,2.3},
{shop,orange,100,3.8},
{shop,pear,200,3.6},
{shop,banana,420,4.5},
{shop,potato,2456,1.2},
%% cost table
{cost,apple,1.5},
{cost,orange,2.4},
{cost,pear,2.2},
{cost,banana,1.6},
{cost,potato,0.6}
]. %%== 查询 ============================================================= do(Q) ->
F = fun() -> qlc:e(Q) end,
{atomic,Val} = mnesia:transaction(F),
Val. %% SELECT * FROM shop
%% 选取所有列
demo(select_shop) ->
do(qlc:q([X || X <- mnesia:table(shop)])); %% SELECT item,quantity FROM shop
%% 选取指定列
demo(select_some) ->
do(qlc:q([{X#shop.item, X#shop.quantity} || X <- mnesia:table(shop)])); %% SELECT * FROM shop WHERE shop.quantity < 250
%% 选取指定条件的数据
demo(where) ->
do(qlc:q([X || X <- mnesia:table(shop),
X#shop.quantity < 250
])); %% 关联查询
%% SELECT shop.* FROM shop,cost wHERE shop.item = cost.name AND cost.price < 2 AND shop.quantity < 250
demo(join) ->
do(qlc:q([X || X <- mnesia:table(shop),
X#shop.quantity < 250,
Y <- mnesia:table(cost),
X#shop.item =:= Y#cost.name,
Y#cost.price < 2
])). %% == 数据操作 =============================================== %% 增加一行
add_shop_item(Name,Quantity,Cost) ->
Row = #shop{item = Name,quantity = Quantity, cost = Cost},
F = fun() ->
mnesia:write(Row)
end,
mnesia:transaction(F). %% 删除一行
remove_shop_item(Item) ->
Oid = {shop,Item},
F = fun() ->
mnesia:delete(Oid)
end,
mnesia:transaction(F). %% 取消一个事务
former(Nwant) ->
F = fun() ->
%% find the num of apples
[Apple] = mnesia:read({shop,apple}),
Napples = Apple#shop.quantity,
%% update the database
NewApple = Apple#shop{quantity = Napples + 2 * Nwant},
mnesia:write(NewApple),
%% find the num of oranges
[Orange] = mnesia:read({shop,orange}),
Noranges = Orange#shop.quantity,
if
Noranges >= Nwant ->
%% update the database
Num = Noranges - Nwant,
NewOrange = Orange#shop{quantity = Num},
mnesia:write(NewOrange);
true ->
%% no enough oranges 取消事务
mnesia:abort(oranges)
end
end,
mnesia:transaction(F). %% 保存复杂数据
add_plans() ->
D1 = #design{
id = {joe,1},
plan = {circle,10}
},
D2 = #design{
id = fred,
plan = {rectangle,[10,5]}
},
F = fun() ->
mnesia:write(D1),
mnesia:write(D2)
end,
mnesia:transaction(F). %% 获复杂数据
get_plans(PlanId) ->
F = fun() -> mnesia:read({design,PlanId}) end,
mnesia:transaction(F).
[erlang] mnesia的更多相关文章
- erlang mnesia 数据库实现SQL查询
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...
- erlang mnesia数据库设置主键自增
Mnesia是erlang/otp自带的分布式数据库管理系统.mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足.mnesia数据表没有主键自增的功能,但在mnesi ...
- erlang mnesia 数据库查询
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...
- erlang mnesia数据库简单应用
mnesia是erlang自带的分布式数据库,基于ets和dets实现的.mnesia兼顾了dets的持久性和ets的高性能,可以自动在多个erlang节点间同步数据库.最关键的是,mnesia实现了 ...
- [Erlang]Mnesia分布式应用
http://blog.csdn.net/erlib/article/details/40743687 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个 ...
- erlang 分布式数据库Mnesia 实现及应用
先推荐一篇:mnesia源码分析(yufeng) - linear hash ETS/DETS/mnesia 都使用了linear hash算法 http://en.wikipedia.org ...
- [Erlang 0119] Erlang OTP 源码阅读指引
上周Erlang讨论群里面提到lists的++实现,争论大多基于猜测,其实打开代码看一下就都明了.贴出代码截图后有同学问这代码是哪里找的? "代码去哪里找?",关于Erla ...
- [Erlang 0115] 2014值得期待的Erlang两本新书
在2014年的开头就有这样一个令人振奋的好消息,Erlang有一本新书即将出版 <The Erlang Runtime System>,其作者happi在2013年3月份公布了这本书的写作 ...
- WhatsApp的Erlang世界
rick 的两个ppt整理 下载:2012 2013 ,使用半年erlang后,重新看这两个ppt才发现更多值的学习的地方,从ppt中整理如下: - Prefer os:timestamp to e ...
随机推荐
- 创蓝语音服务(语音通知验证码).net
public static string PostUrl = "http://zapi.253.com/msg/HttpBatchSendSM"; static void Main ...
- org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from URL
[报错] org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XM ...
- testng执行用例失败,再次执行
我们通过重写testng的retry方法和transform方法来实现用例失败重跑的功能. 首先添加两个文件 TestngRetry.java public class TestngRetry imp ...
- jenkins免密添加SSH Servers
在配置ssh server时可以使用用户名秘密的方式登录,但有点不安全,只要有权限配置jenkins服务器的人就可以看到密码.所以可以利用ssh免密登录的方式链接ssh server. 1.在jenk ...
- mysql 用init-connect+binlog实现用户操作追踪做access的ip的log记录
在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化.我们可以在这里获取用户的登录名称和thread的ID值.然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等 ...
- C++资源之不完全导引
1,前言 无数次听到“我要开始学习C++!”的呐喊,无数次听到“C++太复杂了,我真的学不会”的无奈.Stan Lippman先生曾在<C++ Primer>一书中指出“C++是最为难学的 ...
- 体会 git 之优越性
既生瑜,何生亮.已有subversion,何需git?先有firefox叱咤一时,何需chrome来搅局? 原本以为之前的解决方案已经能够满足现时的需求,但这是真正的事实吗?直到新颖的工具降临,才惊叹 ...
- bnu 10809 聚餐
Lolilu大牛又要请客了~~有些同学呢,是果断要去的,而有些同学呢,只有确定心中的大牛会参加,他才会参加.Lolilu决定请大家去吃金钱豹,因此希望你告诉他一共会有多少人参加,他才知道带多少钱比较合 ...
- oracle SQL学习总结
1.候选键.主键和外键约束: create table Employee( id int primary key, name char(20), birthday Date, address varc ...
- node.js之nodemon 代码热更新 修改代码后服务器自动重启
1.安装nodemon: npm install -g nodemon //全局安装 npm install nodemon --save //局部安装 2.在项目根目录下创建 nodemon.jso ...