打印出Mnesia表的最佳方法

Yol*_*ola 9 erlang mnesia

我试过这段代码:

print_next(Current) ->
    case mnesia:dirty_next(muppet, Current) of
        '$end_of_table' ->
            io:format("~n", []),
            ok;
        Next ->
            [Muppet] = mnesia:dirty_read({muppet, Next}),
            io:format("~p~n", [Muppet]),
            print_next(Next),
            ok
    end.

print() ->
    case mnesia:dirty_first(muppet) of
        '$end_of_table' ->
            ok;
        First ->
            [Muppet] = mnesia:dirty_read({muppet, First}),
            io:format("~p~n", [Muppet]),
            print_next(First),
            ok
    end.
Run Code Online (Sandbox Code Playgroud)

但它太长了.我也可以使用dirty_all_keys然后遍历键列表,但我想知道是否有更好的方法来打印Mnesia表内容.

leg*_*cia 13

如果您只想快速而肮脏地在shell中打印Mnesia表的内容,并且如果您的表不是类型disc_only_copies,那么您可以利用Mnesia将其数据存储在ETS表中并运行的事实:

ets:tab2list(my_table).
Run Code Online (Sandbox Code Playgroud)

或者,如果您认为shell过多地截断数据:

rp(ets:tab2list(my_table)).
Run Code Online (Sandbox Code Playgroud)

当然,不推荐用于"真实"代码.


Muz*_*hua 8

好吧,如果目的是查看表的内容,那么有一个名为tv的应用程序,可以查看ETS和mnesia表.

如果您希望查看终端上的所有表格内容,请尝试以下方法:

traverse_table_and_show(Table_name)->
    Iterator =  fun(Rec,_)->
                    io:format("~p~n",[Rec]),
                    []
                end,
    case mnesia:is_transaction() of
        true -> mnesia:foldl(Iterator,[],Table_name);
        false -> 
            Exec = fun({Fun,Tab}) -> mnesia:foldl(Fun, [],Tab) end,
            mnesia:activity(transaction,Exec,[{Iterator,Table_name}],mnesia_frag)
    end.

然后,如果调用了表,则muppet使用以下函数:

traverse_table_and_show(muppet).

这样做的好处:
如果它在一个事务中执行,它将没有嵌套事务的问题.它的工作量较少,因为它通过mnesia迭代器功能在一个mnesia事务中完成,与你的get_next_key - > do_read_with_key - >的实现相比,然后读取记录(这些是很多操作).有了这个,mnesia会自动告诉它已经覆盖了整个表中的所有记录.此外,如果表是碎片,则您的功能将仅显示第一个片段中的记录.这将迭代属于该表的所有片段.

在这个迭代mnesia方法中,我对Accumulator变量一无所知,它应该伴随着Iterator乐趣,这就是为什么你看到第二个变量的下划线.

可以在此处找到此迭代的详细信息: http://www.erlang.org/doc/man/mnesia.html#foldl-3


Ham*_*ani 8

要简单快速地查看表格内容,您可以使用mnesia的select函数和catch-all Match Specification,如下所示:

CatchAll = [{'_',[],['$_']}].
mnesia:dirty_select(TableName, CatchAll).
Run Code Online (Sandbox Code Playgroud)

并且您也可以在事务上下文中运行它:

CatchAll = [{'_',[],['$_']}].
SelectFun = fun() -> mnesia:select(TableName, CatchAll) end.
mnesia:transaction(SelectFun).
Run Code Online (Sandbox Code Playgroud)

但是,如果您处于具有大数据的生产环境中,请务必小心.