mnesia исключение delete_object?

Я не вижу, что здесь не так, но я могу просто неправильно понять синтаксис. Я пытаюсь удалить запись «пользователь» из моей таблицы мнений «пользователь», имя которой «райан» (их несколько). Вот что я делаю:

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

Кажется, идеальное совпадение. Что может вызвать эту проблему?


person ryeguy    schedule 16.03.2009    source источник


Ответы (1)


mnesia:delete_object/1 и /3 используются для удаления данной записи из таблицы. Он не удаляет несколько записей на основе спецификации соответствия. Это просто более точная версия mnesia:delete/* — она позволяет удалить конкретную запись из таблицы bag.

Чтобы удалить несколько записей, соответствующих спецификации (например, с 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).
person gleber    schedule 16.03.2009
comment
Основная причина сбоя удаления заключается в том, что ключ не привязан. Как вы говорите, все операции удаления удаляются по ключу, а не по совпадению. - person archaelus; 16.03.2009