【问题标题】:Erlang determine if record has a fieldErlang判断记录是否有字段
【发布时间】:2014-06-17 09:28:34
【问题描述】:

我正在更新我保存在 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 字段。如果不存在,将其设置为原子 undefined 并保存回 mnesia。出于某种原因,我很难找到一个好的方法来做到这一点。

任何指导将不胜感激。

【问题讨论】:

    标签: functional-programming erlang erlang-otp mnesia


    【解决方案1】:

    根据 Ulf Wiger 在https://groups.google.com/forum/#!topic/erlang-programming/U6Q0-_Usb50 的回复,您确实需要使用mnesia:transform_table(Tab, Fun, NewAttributeList) 调用来转换表格。

    http://erldocs.com/R16B03-1/mnesia/mnesia.html?i=1&search=mnesia#mnesia

    此函数将参数 Fun 应用于表中的所有记录。 fun 是一个函数,它获取旧类型的记录并返回新类型的转换记录。

    【讨论】:

      【解决方案2】:

      亚历克斯是正确的。这是一个使用 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

      【讨论】:

      • 非常感谢@Adam 和@Alexander!我将这个标记为答案,因为它更彻底,并回答了我在 erl 文档中无法确定的几个问题。
      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2012-06-02
      相关资源
      最近更新 更多