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