zoukankan      html  css  js  c++  java
  • [erlang] mnesia

      1 -module(test_mnesia).
      2 -compile(export_all).
      3 
      4 -include_lib("stdlib/include/qlc.hrl").
      5 
      6 %% 定义记录结构
      7 -record(shop,{item,quantity,cost}).
      8 -record(cost,{name,price}).
      9 -record(design,{id,plan}).
     10 
     11 start() ->
     12     mnesia:start(),
     13     %% 等待表的加载
     14     mnesia:wait_for_tables([shop,cost,design],20000).
     15 
     16 %% 初始化mnesia表结构
     17 init() ->
     18     mnesia:create_schema([node()]),
     19     mnesia:start(),
     20     %% 表创建 mnesia:create_talbe(TableName,[Args])
     21     %% {type,Type}  set,ordered_set,bag 表类型
     22     %% {ram_copies,NodeList} NodeList每个节点都有内存备份 默认为这个{ram_copies,[node()]}
     23     %% {disc_copies,NodeList} NodeList每个节点都有内存备份和磁盘备份 
     24     %% {disc_only_copies,NodeList} NodeList每个节点有磁盘备份 
     25     %% {attributes,AtomList} 要保存的列名称 一般和record有关 record_info(fields,RecordName)
     26     mnesia:create_table(shop,[{attributes,record_info(fields,shop)}]), %% 创建shop表
     27     mnesia:create_table(cost,[{attributes,record_info(fields,cost)}]),
     28     mnesia:create_table(design,[{attributes,record_info(fields,design)}]),
     29     mnesia:stop().
     30 
     31 %% 加载测试数据
     32 reset_tables() ->
     33     mnesia:clear_table(shop),
     34     mnesia:clear_table(cost),
     35     F = fun() ->
     36             lists:foreach(fun mnesia:write/1,example_tables())
     37     end,
     38     mnesia:transaction(F).
     39 
     40 
     41 %% 测试数据
     42 example_tables() ->
     43     [
     44         %% shop table
     45         {shop,apple,20,2.3},
     46         {shop,orange,100,3.8},
     47         {shop,pear,200,3.6},
     48         {shop,banana,420,4.5},
     49         {shop,potato,2456,1.2},
     50         %% cost table
     51         {cost,apple,1.5},
     52         {cost,orange,2.4},
     53         {cost,pear,2.2},
     54         {cost,banana,1.6},
     55         {cost,potato,0.6}
     56     ].
     57 
     58 %%== 查询 =============================================================
     59 
     60 do(Q) ->
     61     F = fun() -> qlc:e(Q) end,
     62     {atomic,Val} = mnesia:transaction(F),
     63     Val.
     64 
     65 %% SELECT * FROM shop
     66 %% 选取所有列
     67 demo(select_shop) ->
     68     do(qlc:q([X || X <- mnesia:table(shop)]));
     69 
     70 %% SELECT  item,quantity FROM shop
     71 %% 选取指定列
     72 demo(select_some) ->
     73     do(qlc:q([{X#shop.item, X#shop.quantity} || X <- mnesia:table(shop)]));
     74 
     75 %% SELECT * FROM shop WHERE shop.quantity < 250
     76 %% 选取指定条件的数据
     77 demo(where) ->
     78     do(qlc:q([X || X <- mnesia:table(shop),
     79                 X#shop.quantity < 250
     80             ]));
     81 
     82 %% 关联查询
     83 %% SELECT shop.* FROM shop,cost wHERE shop.item = cost.name AND cost.price < 2 AND shop.quantity < 250
     84 demo(join) ->
     85     do(qlc:q([X || X <- mnesia:table(shop),
     86                    X#shop.quantity < 250,
     87                    Y <- mnesia:table(cost),
     88                    X#shop.item =:= Y#cost.name,
     89                    Y#cost.price < 2
     90             ])).
     91 
     92 %% == 数据操作 ===============================================
     93 
     94 %% 增加一行
     95 add_shop_item(Name,Quantity,Cost) ->
     96     Row = #shop{item = Name,quantity = Quantity, cost = Cost},
     97     F = fun() ->
     98             mnesia:write(Row)
     99     end,
    100     mnesia:transaction(F).
    101 
    102 %% 删除一行
    103 remove_shop_item(Item) ->
    104     Oid = {shop,Item},
    105     F = fun() ->
    106             mnesia:delete(Oid)
    107     end,
    108     mnesia:transaction(F).
    109 
    110 %% 取消一个事务
    111 former(Nwant) ->
    112     F = fun() ->
    113             %% find the num of apples
    114             [Apple] = mnesia:read({shop,apple}),
    115             Napples = Apple#shop.quantity,
    116             %% update the database
    117             NewApple = Apple#shop{quantity = Napples + 2 * Nwant},
    118             mnesia:write(NewApple),
    119             %% find the num of oranges
    120             [Orange] = mnesia:read({shop,orange}),
    121             Noranges = Orange#shop.quantity,
    122             if 
    123                 Noranges >= Nwant ->
    124                     %% update the database
    125                     Num = Noranges - Nwant,
    126                     NewOrange = Orange#shop{quantity = Num},
    127                     mnesia:write(NewOrange);
    128                 true ->
    129                     %% no enough oranges 取消事务
    130                     mnesia:abort(oranges)
    131             end
    132     end,
    133     mnesia:transaction(F).
    134 
    135 %% 保存复杂数据
    136 add_plans() ->
    137     D1 = #design{
    138         id = {joe,1},
    139         plan = {circle,10}
    140     },
    141     D2 = #design{
    142         id = fred,
    143         plan = {rectangle,[10,5]}
    144     },
    145     F = fun() ->
    146             mnesia:write(D1),
    147             mnesia:write(D2)
    148     end,
    149     mnesia:transaction(F).
    150 
    151 %% 获复杂数据
    152 get_plans(PlanId) ->
    153     F = fun() -> mnesia:read({design,PlanId}) end,
    154     mnesia:transaction(F).

    运行结果

    Eshell V5.8.4  (abort with ^G)
    1> c(test_mnesia).
    {ok,test_mnesia}
    2> test_mnesia:init().
    stopped
    
    =INFO REPORT==== 16-May-2012::17:24:29 ===
        application: mnesia
        exited: stopped
        type: temporary
    3> test_mnesia:start().
    ok
    4> test_mnesia:reset_tables().
    {atomic,ok}
    5> test_mnesia:demo(select_shop).
    [{shop,potato,2456,1.2},
     {shop,orange,100,3.8},
     {shop,apple,20,2.3},
     {shop,pear,200,3.6},
     {shop,banana,420,4.5}]
    6> test_mnesia:demo(select_some).
    [{potato,2456},
     {orange,100},
     {apple,20},
     {pear,200},
     {banana,420}]
    7> test_mnesia:demo(where).      
    [{shop,orange,100,3.8},
     {shop,apple,20,2.3},
     {shop,pear,200,3.6}]
    8> test_mnesia:demo(join). 
    [{shop,apple,20,2.3}]
    9> test_mnesia:add_shop_item(apple,236,2.8).
    {atomic,ok}
    10> test_mnesia:demo(select_shop).           
    [{shop,potato,2456,1.2},
     {shop,orange,100,3.8},
     {shop,apple,236,2.8},
     {shop,pear,200,3.6},
     {shop,banana,420,4.5}]
    11> test_mnesia:add_shop_item(egg,236,2.8).   
    {atomic,ok}
    12> test_mnesia:demo(select_shop).         
    [{shop,potato,2456,1.2},
     {shop,egg,236,2.8},
     {shop,orange,100,3.8},
     {shop,apple,236,2.8},
     {shop,pear,200,3.6},
     {shop,banana,420,4.5}]
    13> test_mnesia:delete_shop_item(egg).        
    ** exception error: undefined function test_mnesia:delete_shop_item/1
    14> test_mnesia:remove_shop_item(egg).
    {atomic,ok}
    15> test_mnesia:demo(select_shop).         
    [{shop,potato,2456,1.2},
     {shop,orange,100,3.8},
     {shop,apple,236,2.8},
     {shop,pear,200,3.6},
     {shop,banana,420,4.5}]
    16> test_mnesia:former(50).
    {atomic,ok}
    17> test_mnesia:demo(select_shop).
    [{shop,potato,2456,1.2},
     {shop,orange,50,3.8},
     {shop,apple,336,2.8},
     {shop,pear,200,3.6},
     {shop,banana,420,4.5}]
    18> test_mnesia:former(100).      
    {aborted,oranges}
    19> test_mnesia:demo(select_shop).
    [{shop,potato,2456,1.2},
     {shop,orange,50,3.8},
     {shop,apple,336,2.8},
     {shop,pear,200,3.6},
     {shop,banana,420,4.5}]
    20> test_mnesia:add_plans().
    {atomic,ok}
    21> test_mnesia:get_plans(a).
    {atomic,[]}
    22> test_mnesia:get_plans(fred).
    {atomic,[{design,fred,{rectangle,[10,5]}}]}
    23> test_mnesia:get_plans(joe). 
    {atomic,[]}
    24>

     

  • 相关阅读:
    《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)--宋宝华
    WebApp 安全风险与防护课堂开课了!
    2019 Vue开发指南:你都需要学点啥?
    每个程序员都该学习的5种开发语言
    每个Web开发者都该了解的12条命令行
    Webpack 4教程
    都 9012了,该选择 Angular、React,还是Vue?
    在 Angular 8 中,我们可以期待些什么
    “宇宙最强” IDE,Visual Studio 2019 正式发布
    Webpack 4教程
  • 原文地址:https://www.cnblogs.com/bluefrog/p/2504625.html
Copyright © 2011-2022 走看看