2010-03-11 2 views
2

나는 erlang + mnesia로 작은 테스트 응용 프로그램을 만들려고합니다.질의 목록 작성 질의에 대한 이해도

add_sample_data() -> 
    Mat = #user{ 
     details = #user_details{ 
    name = "mat", password = "mat" 
     } 
    }, 
    user:insert_user(Mat), 

쿼리가 아닌 빈을 반환 [U#user.details || U <- mnesia:table(user)] :

-record(user_details, {name, password}). 
-record(user, {id, details}). 

는 그 기능이있는 사용자를 삽입 : 여기에 정의 된

가 나는 #user 레코드에서 사용자 테이블 빌드가 명부. 지금 Details.name과 일치하는 레코드가 없으면 이름이 0 인 레코드 또는 일치하는 레코드가 있으면 레코드를 포함하는 목록을 반환하는 쿼리를 작성하려고합니다.

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로하고 싶습니다.

나는 다양한 조합을 시도했지만 성공하지 못했습니다 (컴파일 시간에 종종 실패했습니다.).

나는 어떤 쿼리가 잘 작동하는지 그리고 조금 설명 할 수 있다면 정말 대단합니다!

매트.

마티유 @의 evangeneer을 : ~/편집

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. 

및 오류 나는이 일을하지만 어쩌면 내 문제를 설명하지 않는 한 버전입니다 projects/nopair $ make
다시 컴파일 : src/resources/user_resource
src/resources/user_resource.erl : 22 : 구문 오류 이전 : '.'
SRC/자원/user_resource.erl : 6 : 기능/2 정의되지 않은 메이크업을 user_exists :
*** [ERL] 오류 1

+0

컴파일 할 때 실패하면 여기에 오류 및 경고 목록을 붙여 넣으십시오. 진단을 쉽게 할 수 있습니다 :) –

+0

실패한 컴파일의 한 예가 추가되었습니다 – Mathieu

+0

어쩌면 올바르게 볼 수 없지만'mnesia : transaction (Fun) of ... end' 대신'case mnesia : transaction (재미) ... 끝. 그게 될 수 있을까요? –

답변

4

을 :

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

당신은 user_details 기록에 액세스를 시도하지만 명명되지 않습니다.

내 경험에서
(U#user.details)#user_details.name == "mat" 

, 컴파일러는 #의 user.details가 #user_details 것을 스스로 알아낼하지 않습니다 ...보십시오.

+0

그 것이 었습니다! 나는 많은 것을 시도했다. #user_details가 있건 없건간에 많은 대안을 가지고 있지만 올바른 것을 찾지 못했다. – Mathieu

1

나는 QLC 코드는 컴파일되지 것이 가장 일반적인 이유는 경우라고 생각합니다 qlc 쿼리를 포함하는 모듈에 포함해야하는 헤더 파일을 생략했습니다. 당신의 모듈에 다음과 같은 추가 시도해 문제가 해결되는지 확인 : 문제 행에

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

qlc.hrl이 포함되어 있습니다. QLC 코드는 일부 (복사 및 붙여 넣기 및 적용) 쿼리에서 작동하지만 마음에있는 코드를 작성하는 방법을 이해할 수 없습니다. – Mathieu