【问题标题】:mnesia delete_object exception?mnesia delete_object 异常?
【发布时间】:2010-10-13 14:46:23
【问题描述】:

我看不出这里有什么问题,但我可能只是误解了语法。我正在尝试从我的“用户”mnesia 表中删除一个名字为“ryan”的“用户”记录(它们有多个)。这是我的工作:

Delete=#user{first_name = "ryan", _ = '_'},
mnesia:dirty_delete_object(Delete)

这是我的记录定义:

-record(user, {id,
               username,
               password,
               email,
               first_name,
               last_name,
               last_login, % Date/time user last logged in
               reg_date}). % Date/time user registered the account

这是我得到的例外:

** exception exit: {aborted,
                       {bad_type,user,
                           {user,'_','_','_','_',"ryan",'_','_','_'}}}
     in function  mnesia:abort/1
     in call from users:register/1

这似乎是一个完美的匹配。什么可能导致这个问题?

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

    mnesia:delete_object/1/3 用于从表中删除 given 记录。它不会根据匹配规范删除多条记录。它只是 mnesia:delete/* 的更精确版本 - 它为您提供了一种从 bag 表中删除 specific 记录的方法。

    要删除多个匹配规范的记录(例如name="ryan"),请使用以下代码:

    Delete=#user{first_name = "ryan", _ = '_'},
    List = mnesia:dirty_match_object(Delete)
    lists:foreach(fun(X) ->
                          mnesia:dirty_delete_object(X)
                  end, List).
    

    或者它的交易版本:

    Delete=#user{first_name = "ryan", _ = '_'},
    Fun = fun() ->
                  List = mnesia:match_object(Delete)
                  lists:foreach(fun(X) ->
                                        mnesia:delete_object(X)
                                end, List)
          end,
    mnesia:transaction(Fun).
    

    【讨论】:

    • 删除失败的根本原因是key没有绑定。正如你所说,所有删除操作都是按键删除,而不是匹配。
    猜你喜欢
    • 2010-12-26
    • 2011-05-04
    • 2011-03-04
    • 2013-06-20
    • 2010-12-23
    • 2023-03-11
    • 2015-12-20
    • 2013-02-05
    • 2011-12-06
    相关资源
    最近更新 更多