使用 Erlang mnesia:read/2 不返回任何内容

Posted

技术标签:

【中文标题】使用 Erlang mnesia:read/2 不返回任何内容【英文标题】:Using Erlang mnesia:read/2 Returns Nothing 【发布时间】:2018-01-19 10:02:21 【问题描述】:

我有一个 ram_copies mnesia 设置,我可以插入记录,我可以使用位于此处的以下代码打印它们:How to read all the records of mnesia database in erlang?

开始记录:

-record(someRecord, a=null, b=null).

表:

mnesia:create_table(someRecord,
    [attributes, record_info(fields, someRecord),
      index, [#someRecord.b],
      ram_copies, Nodes,
      type, set]),

插入:

i(rA, rB) ->
  F = fun() -> mnesia:write(#someRecorda=rA, b=rB) end,
  mnesia:transaction(F).

阅读:

r(rB) ->
  F = fun() -> mnesia:read(someRecord, rB) end,
  mnesia:transaction(F).

这会返回 atomic, Result 并且 Result 是空的。

想知道我做错了什么。

谢谢!

更新:事实证明,如果我使用记录“a”作为键,它会起作用。但为什么?我已将它设置为记录“b”作为键。

【问题讨论】:

这行得通吗:mnesia:index_read(someRecord, B, #someRecord.b)? @Dogbert 这行得通。但是,为什么 create_table 有一个未使用的键值然后是“ index, [#someRecord.b]”(除非我用错了)。如果我用“a”替换 rB,read/2 将对我有用。似乎关键是第一个元素,这是硬编码的吗?另外,使用 index_read 与 read 有什么影响? 我已经发布了你所有问题的答案,除了最后一个。我不确定影响。我相信它应该和搜索第一个字段一样快,但是由于需要维护额外的索引mnesia,其他操作会产生开销。 【参考方案1】:

index, List 选项指定元组 mnesia 的哪些元素应该索引。它不会改变mnesia:read 搜索这些字段的行为。记录的第一个字段被视为主键并自动编制索引,并且是 mnesia:read 搜索的字段。要对任何其他元素进行查询,您需要使用 mnesia:index_read 并指定元素的索引:

mnesia:index_read(someRecord, B, #someRecord.b)

还要注意,由于您的表类型是set,并且记录的第一个字段是主键,因此您将无法存储多个具有相同值a 的记录。如果您希望b 成为主键和set 检测重复项的键,则必须重新排序记录的字段并将b 移动到a 之前。如果你这样做,你不需要指定任何index 选项,你也可以使用mnesia:read 而不是mnesia:index_read。这也应该更有效,因为mnesia 不必维护额外的索引。

【讨论】:

我对这里的“索引”也指的是什么以及选择说字符串作为索引、列表和列表字节等有什么影响,等等。谢谢!

以上是关于使用 Erlang mnesia:read/2 不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章

Erlang:不允许的节点/也许 Cookie 问题

asdf-erlang不安装手册页

Erlang cowboy 处理不规范的client

Elixir重命名并包装Erlang模块?

如何使用 erlang 插件在 vscode 中调试 rebar3 erlang?

安装的 erlang R16B03 和 erlc 命令不起作用