mnesia:write / 1如何知道表名?

时间:2015-02-17 06:17:45

标签: erlang mnesia

在Joe Armstrong关于Erlang的书中,有一个插入mnesia数据库的例子:

add_shop_item(Name, Quantity, Cost) ->
    Row = #shop{item=Name, quantity=Quantity, cost=Cost},
    F = fun() ->
        mnesia:write(Row)
    end,
    mnesia:transaction(F).

该行被插入一个名为shop的表中,但如果像Row这样的Erlang记录实际上只是元组,那么会发生什么呢?而mnesia:write / 1不会为表名?

1 个答案:

答案 0 :(得分:1)

记录是元组,其中第一个元素是命名记录的原子,在本例中为shop。在mnesia源代码中,您可以看到它如何提取第一个要用作表名的元素。

https://github.com/erlang/otp/blob/maint/lib/mnesia/src/mnesia.erl#L511-L513

write(Val) when is_tuple(Val), tuple_size(Val) > 2 ->
    Tab = element(1, Val),
    write(Tab, Val, write);