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