3

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.

このチュートリアルからいくつかのものをコピーしました。同様の問題はメソッド (スライド 19) で解決されmnesia:selectますmne_fun_query({sport, Sport})が、今度は 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: function user_exists/2 undefined make:
*** [erl] エラー 1

4

2 に答える 2

5

問題のある行:

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

user_detailsレコードにアクセスしようとしていますが、名前を付けていません。試す...

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

私の経験から、コンパイラーはそれ自体で#user.detailsが#user_detailsであることを理解していません。

于 2010-03-11T15:30:14.440 に答える
1

QLC コードがコンパイルされない最も一般的な理由は、qlc クエリを含むモジュールに含める必要があるヘッダー ファイルを省略した場合だと思います。モジュールに以下を追加してみて、問題が解決するかどうかを確認してください。

-include_lib("stdlib/include/qlc.hrl").
于 2010-03-11T02:41:30.093 に答える