Лучший способ распечатать таблицу Mnesia - PullRequest
9 голосов
/ 14 октября 2011

Я попробовал этот фрагмент кода:

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 ]

13 голосов
/ 14 октября 2011

Если вам нужен быстрый и грязный способ печати содержимого таблицы Mnesia в оболочке, и если ваша таблица не относится к типу disc_only_copies, вы можете воспользоваться тем, что Mnesia хранит свои данные вТаблицы ETS и выполните:

ets:tab2list(my_table).

или, если вы считаете, что оболочка слишком сильно усекает данные:

rp(ets:tab2list(my_table)).

Конечно, не рекомендуется для "реального" кода.

8 голосов
/ 05 октября 2014

Для простого и быстрого просмотра содержимого таблицы вы можете использовать выбрать функцию Мнезия с универсальным Соответствие спецификации следующим образом:

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

, а также вы можете запустить его в контексте транзакции:

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

однако будьте осторожны, если вы находитесь в производственной среде с большими данными.

8 голосов
/ 14 октября 2011

Итак, если вы хотите увидеть содержимое вашей таблицы, есть приложение под названием 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, и поэтому вы видите подчеркивание длявторая переменная.

Подробности этой итерации можно найти здесь: <b><a href="http://www.erlang.org/doc/man/mnesia.html#foldl-3" rel="nofollow noreferrer"><a href="http://www.erlang.org/doc/man/mnesia.html#foldl-3" rel="nofollow noreferrer">http://www.erlang.org/doc/man/mnesia.html#foldl-3</a></a></b>

3 голосов
/ 18 октября 2013

Как сказал Muzaaya, вы можете использовать tv (средство визуализации таблиц) для просмотра таблиц mnesia и ets. В качестве альтернативы вы можете использовать следующий код для получения данных таблицы мнезий - Печать на терминале или, если вы хотите сохранить результат в файле:

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).
...