2010-03-11 70 views
2

我正在嘗試使用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 tutorialmne_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

+0

如果編譯時失敗,請粘貼錯誤和警告列表。它會使診斷更容易:) – 2010-03-11 10:13:38

+0

添加失敗編譯的一個例子 – Mathieu 2010-03-11 10:40:15

+0

也許我看不到東西正確,但你正在使用'mnesia:事務(樂趣)... end'而不是'case mnesia:transaction(樂趣)...結束。這可能嗎? – 2010-03-11 14:33:07

回答

4

在問題行:

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

您試圖訪問user_details記錄,但沒有命名。嘗試...

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

根據我的經驗,編譯器不會自行判斷#user.details是#user_details。

+0

就是這樣!我嘗試了很多<有或沒有#user_details的替代方案,但是我找不到合適的替代方案,請您! – Mathieu 2010-03-11 17:09:06

1

我認爲最常見的原因QLC代碼將無法編譯是,如果你我們忽略了需要包含在包含qlc查詢的模塊中的頭文件。嘗試添加以下到您的模塊,看看它是否解決了這個問題:

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

qlc.hrl。 QLC代碼適用於某些(複製粘貼和改編)查詢,但我無法理解如何編寫我想到的那個 – Mathieu 2010-03-11 10:42:08