我试过这段代码:
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)
当然,不推荐用于"真实"代码.
好吧,如果目的是查看表的内容,那么有一个名为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
要简单快速地查看表格内容,您可以使用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)
但是,如果您处于具有大数据的生产环境中,请务必小心.
归档时间: |
|
查看次数: |
10345 次 |
最近记录: |