gpt4 book ai didi

erlang - 为 mnesia 查询编写查询列表推导式

转载 作者:行者123 更新时间:2023-12-02 05:29:53 27 4
gpt4 key购买 nike

我正在尝试使用 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)]返回一个非空列表。现在我正在尝试构建一个查询,如果没有详细信息与名称匹配的记录,则该查询将返回包含零记录的列表,如果有,则返回匹配的记录。

这是我使用的方法(这个有效):

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
Recompile: src/resources/user_resource
src/resources/user_resource.erl:22: syntax error before: '.'
src/resources/user_resource.erl:6: function user_exists/2 undefined make:
*** [erl] Error 1

最佳答案

在问题行上:

U#user.details.name == "mat"

您正在尝试访问 user_details 记录,但未命名它。尝试...

(U#user.details)#user_details.name == "mat"

根据我的经验,编译器无法自行确定#user.details 是#user_details。

关于erlang - 为 mnesia 查询编写查询列表推导式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2421761/

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