【问题标题】:How to fetch multiple rows in mnesia如何在mnesia中获取多行
【发布时间】:2015-04-14 10:21:41
【问题描述】:
{atomic,[R]}={atomic,[{ios,2,"hhh"},{ios,1,"hhh"}]}

这会产生一个错误。我试图做的是从 mnesia 表和用例语句中获取多行来处理任何错误(如果不存在我正在搜索的记录)。只要有一个或零与搜索的项目相对应的元组可以正常工作,但是当有多个元组时会引发错误。以下是完整代码

x( Artist) ->
Query = fun() ->
        mnesia:match_object({ios,'_', Artist } )
    end,
 X=case mnesia:transaction( Query) of
    {atomic,[R]} ->
io:format("Text found in Android : ~p~n", [R#ios.txt]) ;
    {atomic,[]} ->
        Id=1000, 
        io:format("No records with ID = ~p~n", [Id]);
   {aborted,{no_exists,ios}}->
          hi        
end,
X.

【问题讨论】:

    标签: erlang ejabberd mnesia


    【解决方案1】:

    如果您的请求找到多行,答案是(我猜){atomic,List},其中 List 是一个包含多个元素的列表,因此无法与 [R] 匹配,后者是一个单个元素的列表。

    你可以做的是接收列表并遍历它以打印结果;

    x( Artist) ->
    Query = fun() ->
            mnesia:match_object({ios,'_', Artist } )
        end,
     case mnesia:transaction( Query) of
        {atomic,[]} ->
            Id=1000, 
            io:format("No records with ID = ~p~n", [Id]);
        {atomic,L} ->
            [io:format("Text found in Android : ~p~n", [R#ios.txt]) || R <- L] ;
        {aborted,{no_exists,ios}}->
              hi        
    end.
    

    【讨论】:

    • :非常感谢。它对我有用。还有一个问题是我是否需要添加更多错误案例(目前有 3({atomic,[]},{atomic,L },{aborted,{no_exists,ios}}))。如果是,那可能是什么?
    • 如果你想更通用,你可以匹配 {aborted,_Reason} 并且你将捕获所有可能的错误情况(从事务的角度来看)参见文档 [www.erlang.org /doc/man/mnesia.html#match_object-1]
    猜你喜欢
    • 2015-04-29
    • 2011-08-10
    • 2015-03-20
    • 2018-09-18
    • 2014-07-02
    • 2011-05-24
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多