我有3个用例从mnesia表返回数据的情况 1.返回表的所有值,以便使用foldl, 2. return 1 row so我使用读取 3.根据标准返回可变数量的记录,所以我使用select。Erlang Mnesia选择结果与读取不同,foldl
我想使用相同的代码来管理结果,但select会返回不同的数据结构。我希望有人能够帮助我重组我的选择以便像其他人一样返回。
下面是问题和结果的示例代码。问题是select不像read和foldl那样返回表的记录名称。
-module(testselect2).
-export([runtest/0]).
-record(record_a, {b, c, d}).
-record(record_b, {record_a, e}).
-record(record_c, {record_b, f, intval}).
runtest() ->
mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(record_c, [{attributes, record_info(fields, record_c)}]),
A1 = #record_a{b = "R1", c = "T1", d = "C1"},
B1 = #record_b{record_a = A1, e = "E1"},
C1 = #record_c{record_b = B1, f = "F1", intval = 100},
A2 = #record_a{b = "R2", c = "T2", d = "C2"},
B2 = #record_b{record_a = A2, e = "E2"},
C2 = #record_c{record_b = B2, f = "F2", intval = 200},
A3 = #record_a{b = "R3", c = "T3", d = "C3"},
B3 = #record_b{record_a = A3, e = "E3"},
C3 = #record_c{record_b = B3, f = "F3", intval = 300},
{atomic, Rw} = mnesia:transaction(
fun() ->
mnesia:write(C1),
mnesia:write(C2),
mnesia:write(C3)
end),
io:fwrite("Result write = ~w~n", [Rw]),
{atomic, Rr} = mnesia:transaction(
fun() ->
mnesia:read({record_c, B1})
end),
io:fwrite("Result read = ~w~n", [Rr]),
{atomic, Rf} =
mnesia:transaction(fun() ->
mnesia:foldl(fun (Rec, Acc) -> [Rec | Acc] end,
[],
record_c)
end),
io:fwrite("Result foldl = ~w~n", [Rf]),
MatchHead = #record_c{record_b='$1', f='$2', intval='$3'},
Guard = {'>', '$3', 100},
Result = {{'$1', '$2', '$3'}},
{atomic, Rs} = mnesia:transaction(
fun() ->
mnesia:select(record_c, [{MatchHead, [Guard], [Result]}])
end),
io:fwrite("Result select = ~w~n", [Rs]).
===== 成绩
44> testselect2:的runTest()。
结果写入= OK
结果读取= [{record_c,{record_b,{record_a,[82,49],[84,49],[67,49]},[69,49]} ,[70,49],100}]
结果foldl = [{record_c,{record_b,{record_a,[82,49],[84,49],[67,49]},[69,49 ]},[70,49],100},{record_c,{record_b,{record_a,[82,51],[84,51],[67,51]},[69,51]},[70, 51],300},{record_c,{record_b,{record_a,[82,50],[84,50],[67,50]},[69,50]},[70,50],200}]结果select = [{{record_b,{record_a,[82,51],[84,51],[67,51]},[69,51]},[70,51],300},..., {{record_b,{record_a,[82,50],[84,50],[67,50]},[69,50]},[70,50],200}]
确定
正如你可以看到上面阅读和与foldl记录开始{record_c,{...其中选择缺少record_c,只是有{{...
我已经无法找到一种方法让选择返回相同的结构,以便我的处理代码可以适用于所有3种用例。任何建议将不胜感激。
感谢那些做到了!我真的很欣赏这种快速反应。 – Gregg
@Gregg np。如果SO上的答案解决了您的问题,那么您需要将其标记为“已接受”并/或将其提升为帮助未来用户找到好答案。 –