相当于 "select * from Tb" 的 Erlang 失忆症

Erlang mnesia equivalent of "select * from Tb"

我完全是个 erlang 菜鸟,我只想看看我拥有的特定 table 中有什么。我只想从特定的 table 开始 "select *"。我看到的例子,例如 official documentation,都有我不想要的列限制。我真的不知道如何组成 MatchHead 或 Guard 来匹配任何东西(又名“*”)。

关于如何从 table 中获取所有内容的非常简单的入门指南将不胜感激!

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

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

也就是说,匹配 table foo 中的所有 foo 记录,而不考虑字段的值(每个字段都是 '_',即通配符)。请注意,由于它使用记录构造语法,因此它只能在包含记录定义的模块中工作,或者在计算 rr(my_module) 以使记录定义可用后的 shell 中工作。

(我希望 mnesia:dirty_match_object(foo, '_') 可以工作,但是失败并出现 bad_type 错误。)


要用 select 做到这一点,可以这样称呼它:

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

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


如果表达式太深并且在 shell 中打印了 ...,您可以要求 shell 通过计算 rp(EXPRESSION) 来打印整个内容。 EXPRESSION 可以是再次调用函数,或者 v(-1) 表示由前一个表达式编辑的值 return,或者 v(42) 表示由前一个表达式编辑的值 return shell 提示 42>.

前面的表达式

例如,您可以使用 qlc:

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