相当于 "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).
我完全是个 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).