mnesia:write/1 是如何知道 table 名字的?
How does mnesia:write/1 know the table name?
在 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
的 table 中,但是如果像 Row
这样的 Erlang 记录实际上只是元组,那么这将如何发生,而 mnesia:write/1不接受 table 名称的参数?
记录是元组,其中第一个元素是命名记录的原子,在本例中为 shop
。在 mnesia 源代码中,您可以看到它如何提取第一个元素用作 table 名称。
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);
在 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
的 table 中,但是如果像 Row
这样的 Erlang 记录实际上只是元组,那么这将如何发生,而 mnesia:write/1不接受 table 名称的参数?
记录是元组,其中第一个元素是命名记录的原子,在本例中为 shop
。在 mnesia 源代码中,您可以看到它如何提取第一个元素用作 table 名称。
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);