【发布时间】:2011-01-26 04:16:29
【问题描述】:
我正在尝试使用 erlang+mnesia 构建一个小型测试应用程序。
我有一个从 #user 记录构建的用户表,定义如下:
-record(user_details, {name, password}).
-record(user, {id, details}).
然后我插入一个具有该功能的用户:
add_sample_data() ->
Mat = #user{
details = #user_details{
name = "mat", password = "mat"
}
},
user:insert_user(Mat),
查询[U#user.details || U <- mnesia:table(user)] 返回一个非空列表。
现在我正在尝试构建一个查询,如果没有与 details.name 匹配的名称或匹配记录的记录,则该查询将返回一个包含零记录的列表。
这是我使用的方法(这个可行):
user_exists() ->
Fun = fun() ->
Query = qlc:q([
U#user.details ||
U <- mnesia:table(user)
]),
qlc:e(Query)
end,
case mnesia:transaction(Fun) of
{atomic, []} -> false;
{atomic, [_User]} -> true
end.
我从this tutorial 复制了一些东西。 mnesia:select 在mne_fun_query({sport, Sport}) 方法(幻灯片 19)中解决了类似的问题,但现在我想用 qlc 来解决。
我尝试了各种组合,但都没有成功(通常在编译时失败..)。
我是 erlang 的新手,如果您能说出哪个查询应该有效并稍微解释一下,那将不胜感激!
垫子。
编辑
这是一个不起作用的版本,但也许可以更好地解释我的问题
user_exists() ->
Fun = fun() ->
Query = qlc:q([
U#user.details ||
U <- mnesia:table(user),
U#user.details.name == "mat" <<<<< This is the line with the problem
]),
qlc:e(Query)
end,
case mnesia:transaction(Fun) of
{atomic, []} -> false;
{atomic, [_User]} -> true
end.
我遇到的错误:
mathieu@evangeneer:~/projects/nopair$ make
重新编译:src/resources/user_resource
src/resources/user_resource.erl:22: 之前的语法错误:'.'
src/resources/user_resource.erl:6: 函数 user_exists/2 未定义 make:
*** [erl] 错误 1
【问题讨论】:
-
如果在编译时失败,请在此处粘贴错误和警告列表。这将使诊断更容易:)
-
添加了一个编译失败的例子
-
也许我看不清楚,但你使用的是
mnesia:transaction(Fun) of ... end而不是case mnesia:transaction(Fun) of ... end。会这样吗? -
我只是做了很多东西(已修复),我添加了一个指示来告诉哪一行出现故障,没有它(如第一个示例中所示),它编译和工作得很好。但它返回表的所有记录(显然没有约束)
-
在哪里编写和运行这些查询?
标签: erlang list-comprehension mnesia