假设我有一个简单的记录定义:
-record(data, {primary_key = '_', more_stuff = '_'}).
我想要一个简单的函数,将这些记录之一添加到 mnesia 数据库中。但是如果已经有一个具有相同主键的条目,我希望它失败。
(在下面的例子中,假设我已经定义了
db_get_data(Key)->
Q = qlc:q([Datum
|| Datum = #data{primary_key = RecordKey}
<- mnesia:table(data),
RecordKey =:= Key]),
qlc:e(Q).
)
以下作品,但让我觉得有点丑陋......
add_data(D) when is_record(D, data)->
{atomic, Result} = mnesia:transaction(fun()->
case db_get_data(D#data.primary_key) of
[] -> db_add_data(D);
_ -> {error, bzzt_duplicate_primary_key}
end
end),
case Result of
{error, _} = Error -> throw(Error);
_ -> result
end.
这也有效,但也很丑陋:
add_data(D) when is_record(D, data)->
{atomic, Result} = mnesia:transaction(fun()->
case db_get_data(D#data.primary_key) of
[] -> db_add_data(D);
_ -> throw({error, bzzt_duplicate_primary_key})
end
end).
它与上面的不同之处在于上面的 throws
{error, bzzt_duplicate_primary_key},
而这个抛出
{error, {badmatch, {aborted, {throw,{error, bzzt_duplicate_primary_key}}}}}
那么:是否有一些约定来指示这种错误?或者有没有一种内置的方法可以让 mnesia 为我抛出这个错误?