我正在更新我保存在 mnesia 中的记录模式。新架构包含一个新字段,我想在按 id 读取记录后,检查该记录是否具有该字段,如果没有,将记录更新为新架构。

所以,例如我们的旧记录是这样的:

-record(cust, {id, name, street_address, city, state, zip})。

新记录添加了字段 street_address2:

-record(cust, {id, name, street_address, street_address2, city, state, zip})。

我希望能够即时升级现有记录的架构。要使用当前的逻辑,我需要按 id 查找记录,检查记录中是否存在 address_line2 字段。如果它不存在,将它设置为未定义的原子并保存回 mnesia。出于某种原因,我很难找到一个好的方法来做到这一点。

任何指导将不胜感激。

最佳答案

亚历克斯是对的。以下是使用 transform_table 进行描述的示例:

-record(cust, {id, name, street_address, street_address2, city, state, zip}). % This should be the record definition

mnesia:transform_table(
 cust,
 fun({cust,
           Id,
           Name,
           StreetAddress,
           City,
           State,
           Zip
      }) ->
      {cust,
           Id,
           Name,
           StreetAddress,
           undefined, % This is setting it to the atom undefined.  You could also do "", or anything you want.
           City,
           State,
           Zip
      }
 end,
 record_info(fields, cust)
).

发生的情况是第一个元组中的变量(Id、Name、StreetAddress 等)从现有记录中自动设置。然后将记录转换为第二个元组(乐趣的返回),使用这些设置的变量来分配新值。此过程应用于表中的每个现有记录。

请记住,该功能在任何方面都不是神奇的,因此您可以在其中做任何您需要做的事情,例如检查 ID 或其他任何事情。但是对于简单地向记录添加一个字段,您可以像我在这里展示的那样进行。

如果您是从控制台执行此操作,请务必使用 rr() 或其他方法加载记录定义。

这是 transform_table 的文档:http://www.erlang.org/doc/man/mnesia.html#transform_table-3

关于functional-programming - Erlang 判断记录是否有字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23398609/

10-12 07:28