[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 ...
随机推荐
- python抓取内涵段子文章
# coding:utf-8 from urllib.request import urlretrieve import threading import requests from bs4 impo ...
- java实战
1.http://learning.happymmall.com/ http://www.happymmall.com/index.html 前台官网 http://test.happymmall. ...
- POJ 1948 Triangular Pastures
题意: 把很多单独的线段重新组合成一个三角形,使得三角形面积最大(所有的线段都必须用上). 思路: 三角形的任意一条边的边长不能超过周长的一半,只需要用dp枚举两条边j,k,剩下的一条边长为tot ...
- CF 554A 字符串水题
给出一个字符串,问再加入一个字母,最多能形成多少种字符串 inputaoutput51inputhioutput76 # include <iostream> # include < ...
- docker:一个支持django的dockerfile
其中,包括了主要的生产环境模块, 从alpine作起,镜像不大.保存用. FROM alpine:3.7 COPY . /target-dir WORKDIR /target-dir RUN sed ...
- 均方根误差(RMSE),平均绝对误差 (MAE),标准差 (Standard Deviation)
来源:https://blog.csdn.net/capecape/article/details/78623897 RMSE Root Mean Square Error, 均方根误差是观测值与真值 ...
- video.js视频播放器
免费视频播放器videojs中文教程 Video.js是一款web视频播放器,支持html5和flash两种播放方式.更多关于video.js的介绍,可以访问官方网站介绍,我之前也写过一篇关于vide ...
- element-ui的rules中正则表达式
<template> <el-form :model="unuseForm" label-position="top" :rules=&quo ...
- echarts地图定时切换散点及多图表级联联动
本文目录 1. 摘要 2.引入ECharts以及地图相关json 3. 界面布局 4. js实现图形布局 5.定时循环jquery实现 6. 总结 1. 摘要 最近做项目遇到个统计相关需求,一个页面 ...
- JFreeChart 之折线图
JFreeChart 之折线图 一.JFreeChart 简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications, applets ...