Functional programming Erlang确定记录是否有字段

Functional programming Erlang确定记录是否有字段,functional-programming,erlang,otp,mnesia,Functional Programming,Erlang,Otp,Mnesia,我正在更新保存在mnesia中的记录模式。新模式包含一个新字段,在按id读取记录后,我想检查该记录是否包含该字段,如果没有,则将该记录更新为新模式 例如,我们的旧记录如下: -记录(客户,{id,姓名,街道地址,城市,州,邮编}) 新记录添加了字段street_address2: -记录(客户,{id,姓名,街道地址,街道地址2,城市,州,邮编}) 我希望能够动态升级现有记录的模式。要使用当前逻辑执行此操作,我需要按id查找记录,检查记录是否存在address_line2字段。如果不存在,则将其

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

例如,我们的旧记录如下:

-记录(客户,{id,姓名,街道地址,城市,州,邮编})

新记录添加了字段street_address2:

-记录(客户,{id,姓名,街道地址,街道地址2,城市,州,邮编})

我希望能够动态升级现有记录的模式。要使用当前逻辑执行此操作,我需要按id查找记录,检查记录是否存在address_line2字段。如果不存在,则将其设置为未定义的atom,并保存回mnesia。出于某种原因,我很难找到一个好方法来做到这一点


任何指导都将不胜感激。

根据Ulf Wiger在的回复,您确实需要使用
mnesia:transform_table(Tab,Fun,NewAttributeList)
调用来转换表格

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


亚历克斯是对的。下面是一个使用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()或其他方法加载记录定义


以下是转换表的文档:

非常感谢@Adam和@Alexander!我将这一条标记为答案,因为它更全面,并回答了我在erl文档中难以确定的几个问题。