написать список запросов для понимания мнезии - PullRequest
3 голосов
/ 11 марта 2010

Я пытаюсь создать небольшое тестовое приложение с помощью 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.

Я скопировал кое-что из этого урока . Аналогичная проблема решается с помощью mnesia:select в методе mne_fun_query({sport, Sport}) (слайд 19), но теперь я хотел бы сделать это с помощью 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: функция user_exists / 2 undefined make:
*** [erl] Ошибка 1

Ответы [ 2 ]

5 голосов
/ 11 марта 2010

На проблемной линии:

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

Вы пытаетесь получить доступ к записи user_details, но не называете ее. Попробуйте ...

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

Исходя из моего опыта, компилятор не может понять, что # user.details является # user_details.

1 голос
/ 11 марта 2010

Я думаю, что наиболее распространенная причина, по которой код QLC не скомпилируется, - это если вы оставили файл заголовка, который вам необходимо включить в модули, содержащие запросы qlc. Попробуйте добавить следующее в ваш модуль и посмотрите, решит ли он проблему:

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