打印出Mnesia表的最佳方法

时间:2011-10-14 06:14:41

标签: 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.

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

4 个答案:

答案 0 :(得分:13)

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

ets:tab2list(my_table).

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

rp(ets:tab2list(my_table)).

当然不建议用于“真实”代码。

答案 1 :(得分: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).

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

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

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

答案 2 :(得分:8)

要简单快速地查看您的表格内容,您可以使用选择 mnesia 的功能,使用全部Match Specification,如下所示:

CatchAll = [{'_',[],['$_']}].
mnesia:dirty_select(TableName, CatchAll).

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

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

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

答案 3 :(得分:3)

正如Muzaaya所说,你可以使用tv(表格可视化工具)查看mnesia和ets表。 或者,您可以使用以下代码获取mnesia表数据 - 在终端上打印或者您希望将结果存储在文件中:

select_all() -> 
   mnesia:transaction( 
fun() ->
    P=qlc:e(qlc:q([E || E <- mnesia:table(tableName)])),      %query to select all data from table named 'tableName'                                                                                    
    io:format(" ~p ~n ", [P]), % Prints table data on terminal
    to_file("fileName.txt",P) % to_file method writes the data to file
end ).


to_file(File, L) ->
  mnesia:transaction( 
fun() ->
      {ok, S} = file:open(File, write),
      lists:foreach(fun(X) -> io:format(S, "~p.~n" ,[X]) end, L),
      file:close(S)
  end).