erlang mnesia 遍历
2016-05-27 10:31
435 查看
Best way to print out Mnesia table
up vote 5 down vote favorite 2 | I tried this code snippet: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. But it is so long. Also I can use dirty_all_keysand then iterate through key list, but I want to know if there is a better way to print out Mnesia table contents. erlang mnesia
| ||||
|
4 Answers
activeoldest
votes
up vote 7 down vote accepted | Well, if the intent is to see the contents of your table, there is the application called tv, which can view both ETS and mnesia tables. If you wish to see all the table contents on your terminal, then try something like this: 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. Then if your table is called muppet, you use the function as follows: traverse_table_and_show(muppet). Advantages of this: If its executed within a transaction , it will have no problems of nested transactions. It is less work because its done within one mnesia transaction through mnesia iterator functionality as compared to your implementation of get_next_key -> do_read_with_key -> then read the record (these are many operations). With this, mnesia will automatically tell that it has covered all the records in your entire table. Also, if the table is fragmented, your functionality will only display records in the first fragment. This will iterate through all the fragments the belong to that table. In this iteration mnesia method, i do nothing with the Accumulator variable which should go along with the Iteratorfun and thats why you see the underscore for the second variable. Details of this iteration can be found here: http://www.erlang.org/doc/man/mnesia.html#foldl-3
| ||||
|
up vote 5 down vote | If you just want a quick and dirty way to print the contents of a Mnesia table in the shell, and if your table is not of typedisc_only_copies, then you can take advantage of the fact that Mnesia stores its data in ETS tables and run: ets:tab2list(my_table). or, if you think the shell truncates the data too much: io:format("~p~n", [ets:tab2list(my_table)]). Not recommended for "real" code, of course.
| ||||
|
up vote 4 down vote | For a simple and quick look at your table contents you can use select function of mnesia with catch-all Match Specification as follows: CatchAll = [{'_',[],['$_']}]. mnesia:dirty_select(TableName, CatchAll). and also you can run it inside a transaction context: CatchAll = [{'_',[],['$_']}]. SelectFun = fun() -> mnesia:select(TableName, CatchAll) end. mnesia:transaction(SelectFun). however be careful if you are in a production environment with a big data.
| ||
add a comment |
up vote 1 down vote | As Muzaaya told, you can you use tv (table visualizer tool) to view both mnesia and ets tables.Alternatively, you can use the following code to get mnesia table data - Print on terminal or in case you want to store the result in a file :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). |
相关文章推荐
- Erlang项目内存泄漏分析方法
- Erlang实现的一个Web服务器代码实例
- Erlang并发编程介绍
- Erlang的一些编程技巧分享
- Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法
- Erlang中的模块与模式匹配介绍
- Erlang中的函数与流程控制介绍
- Erlang语法学习笔记:变量、原子、元组、列表、字符串
- Erlang中的Record详解
- Erlang初学:Erlang的一些特点和个人理解总结
- Erlang中的OTP简介
- Erlang中遍历取出某个位置的最大值代码
- Erlang中3种生成随机数的方法
- Erlang中的并发程序简介
- Erlang分布式节点中的注册进程使用实例
- Erlang中的注册进程使用实例
- Erlang中的映射组Map详细介绍
- CentOS 6.5源码安装Erlang教程
- Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
- Erlang实现的百度云推送Android服务端实例