gpt4 book ai didi

database - 防止添加主键已存在于 mnesia 中的记录的最佳方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:10 25 4
gpt4 key购买 nike

假设我有一个简单的记录定义:

-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).

和上面不同的是上面抛出

{error, bzzt_duplicate_primary_key},

而这个抛出

{error, {badmatch, {aborted, {throw,{error, bzzt_duplicate_primary_key}}}}}

那么:是否有一些约定来指示此类错误?或者是否有一种内置方法可以让 mnesia 为我抛出此错误?

最佳答案

我认为它们都很好,如果你只是让你的代码更漂亮,比如:

add_data(D) when is_record(D, data)->

Fun = fun() ->
case db_get_data(D#data.primary_key) of
[] -> db_add_data(D);
_ -> throw({error, bzzt_duplicate_primary_key})
end
end,

{atomic, Result} = mnesia:activity(transaction, Fun).

add_data(D) when is_record(D, data)->

Fun = fun() ->
case db_get_data(D#data.primary_key) of
[] -> db_add_data(D);
_ -> {error, bzzt_duplicate_primary_key}
end
end,

{atomic, Result} = mnesia:activity(transaction, Fun),

case Result of
{error, Error} -> throw(Error);
_ -> result
end.

你是抛出错误还是返回错误?我自己会返回一个错误。我们将代码分成 mnesia 工作单元——一个具有一组功能的模块,这些功能执行基本的 mnesia 事件,而不是在事务中,以及一个 api 模块,它将工作单元“组合”成 mnesia 事务,其功能看起来与上面的非常相似.

关于database - 防止添加主键已存在于 mnesia 中的记录的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com