代码之家  ›  专栏  ›  技术社区  ›  Mathieu

为一个记忆记忆查询编写一个查询列表理解

  •  3
  • Mathieu  · 技术社区  · 16 年前

    我正在尝试用Erlang+Mnesia构建一个小的测试应用程序。

    我有一个基于用户记录的用户表构建,定义如下:

    -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来实现它。

    我尝试了各种组合,但没有成功(通常在编译时失败)。

    我对二郎真的很陌生,如果你能告诉我哪个查询应该有效,并稍微解释一下,我会非常感激的!

    垫子。

    编辑

    这里有一个版本不起作用,但可以更好地解释我的问题

    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@Evangener:~/projects/nopair$make
    重新编译:src/resources/user_resource
    src/resources/user_resource.erl:22:前面有语法错误:“”。
    src/resources/user_resource.erl:6:函数user_exists/2 undefined make:
    ***[erl]错误1

    2 回复  |  直到 16 年前
        1
  •  5
  •   Tadmas    16 年前

    在问题行:

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

    您正试图访问 user_details 记录但不命名。尝试...

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

    根据我的经验,编译器本身并没有发现“user.details”是“user”的详细信息。

        2
  •  1
  •   archaelus    16 年前

    我认为QLC代码不编译的最常见原因是,如果您遗漏了包含QLC查询的模块中需要包含的头文件。尝试将以下内容添加到模块中,看看它是否解决了问题:

    -include_lib("stdlib/include/qlc.hrl").