我创建了一个名称与其记录名称不同的表。以下是代码段
%% ---- record definition -------------------------------- -record(object,{key,value}).在这样做的过程中,mnesia大声呼喊。该表格创建得非常好,可以在
%% ---- create table ------------------------------------- {atomic,ok} = mnesia:create_table(mytable,[ {type,set}, {frag_properties,[ {node_pool,[node()]}, {n_fragments,4}, {n_disc_copies,1}]}, {attributes,record_info(fields,object)}] ),
%% ------- inserting --------------------------------
insert()-> F = fun() -> R = #object{ key = "MyKey", value = "Value" }, mnesia:write(mytable,R,write) end, mnesia:activity(transaction,F,[],mnesia_frag).
tv:start().
或mnesia:info().
中查看。这是我在shell上看到的错误。** exception exit: {aborted, {bad_type, #object{ key = "MyKey", value = "Value"}}} in function mnesia:wrap_trans/6 (mnesia.erl, line 395)现在,通常,我认为当创建表时使用的记录定义与插入表中的记录结构不同时,会出现这样的错误。我想知道这只是我正在使用的功能的问题,即:
mnesia:write/3
当表名与记录名不同时有帮助。mnesia:write/3
时,记录会在表格中正确插入。但是我的应用程序需求是这样的,我将创建几个不同的表,但它们存储相同的记录结构/定义。我希望有不同的表,但它们的record_info
定义是相同的。 Erlang otp R15B, mnesia-4.6 , windows 7 enterprise, 32-bit operating system, Dell laptop, intel core i5, 4GB RAM
我正在处理的所有其他erlang项目都很好,它们没有像这样的奇怪/意外行为。< / p>
答案 0 :(得分:9)
创建表时必须使用{record_name, object}
属性。 e.g。
{atomic,ok} = mnesia:create_table(mytable,[
{type,set},
{frag_properties,[
{node_pool,[node()]},
{n_fragments,4},
{n_disc_copies,1}]},
{record_name, object},
{attributes,record_info(fields,object)}]
),
来自docs:
{record_name,Name},其中Name必须是原子。存储在表中的所有记录都必须将此名称作为第一个元素。它默认使用与表名相同的名称。