Erlang mnesia相当于“select * from Tb”

时间:2015-02-13 17:22:08

标签: select erlang mnesia

我是一个总的erlang noob,我只想看看我所拥有的特定桌子里有什么。我想从特定的表中“选择*”开始。我看到的例子,例如official documentation,都有列限制,我真的不想要。我真的不知道如何形成MatchHead或Guard以匹配任何东西(又名“*”)。

非常感谢一个关于如何将所有东西从桌子上拿出来的非常简单的入门书。

2 个答案:

答案 0 :(得分:3)

例如,您可以使用qlc

F = fun() ->
            Q = qlc:q([R || R <- mnesia:table(foo)]),
            qlc:e(Q)
    end,
mnesia:transaction(F).

答案 1 :(得分:1)

最简单的方法可能是mnesia:dirty_match_object

mnesia:dirty_match_object(foo, #foo{_ = '_'}).

即,匹配表foo中的foo记录中的所有内容,无论字段的值如何(每个字段都为'_',即通配符)。请注意,由于它使用记录构造语法,因此它只能在您已包含记录定义的模块中工作,或者在评估rr(my_module)以使记录定义可用后在shell中工作。

(我希望mnesia:dirty_match_object(foo, '_')能够正常工作,但失败并出现bad_type错误。)


要使用select执行此操作,请将其命名为:

mnesia:dirty_select(foo, [{'_', [], ['$_']}]).

此处MatchHead_,即匹配任何内容。守卫是[],一个空列表,即没有额外的限制。结果规范是['$_'],即返回整个记录。有关匹配规范的详细信息,请参阅match specifications chapter of the ERTS user guide


如果表达式太深并且在shell中打印了...,则可以通过评估rp(EXPRESSION)让shell打印整个内容。 EXPRESSION可以再次是函数调用,也可以是前一个表达式返回的值v(-1),或v(42)表示shell前缀{{1}前面的表达式返回的值}}