我正在嘗試使用erlang + mnesia構建一個小測試應用程序。爲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。 mne_fun_query({sport, Sport})
方法(幻燈片19)中的mnesia:select
解決了類似的問題,但現在我想用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.
和錯誤,我有:
馬修@ evangeneer:〜/ projects/nopair $ make
重新編譯:src/resources/user_resource
src/resources/user_resource.erl:22:之前的語法錯誤:'。'
的src /資源/ user_resource.erl:6:功能user_exists/2未定義化妝:
*** [ERL]錯誤1
如果編譯時失敗,請粘貼錯誤和警告列表。它會使診斷更容易:) – 2010-03-11 10:13:38
添加失敗編譯的一個例子 – Mathieu 2010-03-11 10:40:15
也許我看不到東西正確,但你正在使用'mnesia:事務(樂趣)... end'而不是'case mnesia:transaction(樂趣)...結束。這可能嗎? – 2010-03-11 14:33:07