zoukankan      html  css  js  c++  java
  • [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).
  • 相关阅读:
    windows下编译Boost库
    linux下编译Boost库
    CEPH安装教程(下)
    CEPH安装教程(中)
    CEPH安装教程(上)
    nfs使用教程
    iscsi使用教程(下)
    POJ-2096 Collecting Bugs 概率dp
    HDU-3586 Information Disturbing 树形dp+二分
    HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化
  • 原文地址:https://www.cnblogs.com/AloneSword/p/4939800.html
Copyright © 2011-2022 走看看