【问题标题】:How to update a Mnesia table in Erlang如何在 Erlang 中更新 Mnesia 表
【发布时间】:2012-03-22 00:36:24
【问题描述】:

我的代码有点问题。我有一个包含汽车详细信息、名称、价格和数量的表格,因此我正在尝试创建一个名为 buy 的函数,该函数将用于购买特定汽车。当用户购买例如 5 辆宝马汽车时,他们会拨打buy_car(bmw,5)。现在,我想更新 BMW 汽车的新数量值。

我的尝试如下,但我似乎无法解决它,我是 Erlang 的新手。

buy_car(X,Ncars) ->

    F = fun() ->

        %% ----first i find the number of car X available in the shop
        [Xcars] = mnesia:read({car,X}),
        Nc = Xcars#car.quantity,
        Leftcars = Xcars#car{quantity = Nc - Ncars},

        %% ---now we update the database
        mnesia:write(Leftcars),

    end,
    mnesia:transaction(F).

请帮助我编写一个从商店购买汽车的函数。

【问题讨论】:

    标签: database transactions erlang mnesia


    【解决方案1】:

    但是你的实现工作正常,除了你在 mnesia:write(Leftcars) 之后添加了非法逗号。 这是有效的代码(我将您的实现尝试为 buy_car2)。

    -module(q).
    
    -export([setup/0, buy_car/2, buy_car2/2]).
    
    -record(car, {brand, quantity}).
    
    setup() ->
        mnesia:start(),
        mnesia:create_table(car, [{attributes, record_info(fields, car)}]),
        mnesia:transaction(fun() -> mnesia:write(#car{brand=bmw, quantity=1000}) end).
    
    buy_car(Brand, Ncars) ->
        F = fun() ->
             [Car] = mnesia:read(car, Brand), % crash if the car is missing
             mnesia:write(Car#car{quantity = Car#car.quantity - Ncars})
        end,
        mnesia:transaction(F).
    
    buy_car2(X,Ncars) ->
        F = fun() ->
            %% ----first i find the number of car X available in the shop
            [Xcars] = mnesia:read({car,X}),
            Nc = Xcars#car.quantity,
            Leftcars = Xcars#car{quantity = Nc - Ncars},
            %% ---now we update the database
            mnesia:write(Leftcars)
        end,
        mnesia:transaction(F).
    

    【讨论】:

    • 非常感谢,这正是我所需要的,我是 erlang 新手,但对其他语言非常好,谢谢你的帮助。 5*
    【解决方案2】:

    我会做如下的事情:

    考虑到记录定义为: -记录(汽车记录,{汽车,数量})。 以下函数将更新数据: 买车(X,NCars)-> 行 = #car_record{汽车 = X,数量 = NCars}。 mnesia:ets(fun()-> mnesia:dirty_write(Row) end), mnesia:change_table_copy_type(guiding_data, node(), disc_copies)。

    要使用上述方法,mnesia 表必须创建为“ram_copies”并且没有复制节点。此外,如果发生大量更新,由于性能问题,您可能不希望每次更新都将 ram_copies 复制到磁盘,而是会以时间触发的方式进行。

    【讨论】:

    • 感谢您的回复,您知道如何从表中已有的数量中减去 NCars,然后使用新的数量值更新记录吗?例如数量 = 数量 - NCars,如果我这样写可以吗?
    猜你喜欢
    • 2014-06-06
    • 2019-06-04
    • 2017-03-25
    • 2013-07-03
    • 2017-12-10
    • 2016-09-20
    • 2015-07-09
    • 2015-06-17
    • 2012-01-10
    相关资源
    最近更新 更多