我尝试了这段代码:
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表格内容。
答案 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).