【问题标题】:Erlang mnesia equivalent of "select * from Tb"Erlang mnesia 相当于 "select * from Tb"
【发布时间】:2015-04-14 19:46:30
【问题描述】:

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

非常感谢您提供关于如何从表格中取出所有内容的非常简单的入门教程!

【问题讨论】:

    标签: select erlang mnesia


    【解决方案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 提示符42> 的表达式返回的值。

    【讨论】:

    • 我收到一个错误* 1: record muc_room undefined。如果我这样做mnesia:system_info(tables).,那么muc_room 在列表中。
    • dirty_select 有效:) 它确实用... 缩写了一些数据有没有办法将结果转储到文件中?还是防止缩写?另外,谢谢你的描述。为什么结果规范中有$ 而匹配规范中没有?
    • 有关$的信息,请参阅erlang.org/doc/apps/erts/match_spec.html
    • 谢谢,erlang mnesia:select 文档提到了 erts 匹配规范但没有链接,我找不到它。
    • 我更新了答案并完整添加了有关记录定义和打印术语的详细信息。
    【解决方案2】:

    例如,您可以使用qlc:

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

    【讨论】:

    • 我喜欢简单,但我收到了一个错误** exception error: no match of right hand side value #Fun&lt;erl_eval.20.82930912&gt;。当然,我已经用一张真实的桌子替换了foo。我不明白错误消息告诉我什么:(
    • 你在shell里试试吗?您已经将一个值绑定到变量F。先在shell中输入f(F).
    • 是的,重新启动了 shell,它就像一个冠军一样工作。我不知道F = ... 不会取代 F。谢谢。
    猜你喜欢
    • 2011-02-24
    • 2012-03-16
    • 1970-01-01
    • 2012-02-01
    • 2012-03-10
    • 2021-09-22
    • 2023-03-02
    • 2023-01-11
    • 2021-05-28
    相关资源
    最近更新 更多