2010-03-11 4 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 tutorial. Аналогичная проблема решена с помощью метода 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. 

и ошибка у меня есть:

Матье @ evangeneer: ~/проекты/nopair $ make
Перекомпилировать: src/resources/user_resource
src/resources/user_resource.erl: 22: синтаксическая ошибка до: '.'
SRC/ресурсы/user_resource.erl: 6: функция user_exists/2 неопределенный Марк:
*** [Эрл] Ошибка 1

+0

Если это не удалось во время компиляции, вставьте здесь список ошибок и предупреждений. Это упростит диагностику :) –

+0

добавлен один пример неудачной компиляции – Mathieu

+0

Возможно, я не вижу ничего правильно, но вы используете «mnesia: transaction (Fun) of ... end', а не« case mnesia: transaction (Fun) of ... end'. Может ли это так? –

ответ

4

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

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

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

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

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

+0

. Я попробовал> много <альтернатив с или без #user_details, но я не нашел нужного, thx you! – Mathieu

1

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

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

qlc.hrl включен. QLC-код работает для некоторого (скопированного и вставленного и адаптированного) запроса, но я не могу понять, как написать тот, который я имею в виду – Mathieu

 Смежные вопросы

  • Нет связанных вопросов^_^