scrivere la list comprehension query per una query mnesia
-
19-09-2019 - |
Domanda
Sto cercando di costruire una piccola applicazione test con Erlang + mnesia.
Ho una tabella utente costruire dal record #user, come definito qui:
-record(user_details, {name, password}).
-record(user, {id, details}).
quindi inserisco un utente con questa funzione:
add_sample_data() ->
Mat = #user{
details = #user_details{
name = "mat", password = "mat"
}
},
user:insert_user(Mat),
il [U#user.details || U <- mnesia:table(user)]
interrogazione restituire una lista non vuota.
ora sto cercando di costruire una query che restituisce una lista contenente record di zero se non v'è alcun record con details.name nome corrispondente o il record corrispondente se ce n'è uno.
Ecco il metodo che uso (questo funziona):
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.
ho copiato alcune cose da questo tutorial . Un problema simile si risolve con mnesia:select
nel metodo mne_fun_query({sport, Sport})
(slide 19), ma ora vorrei farlo con qlc.
Ho provato varie combinazioni, ma senza alcun successo (spesso fallito al momento della compilazione ..).
Sono veramente nuovo a Erlang, se si può dire che query deve opere e spiega un po ', che sarebbe molto apprezzato!
mat.
modifica
Questa è una versione che non funziona ma forse spiegare meglio il mio problema
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.
e l'errore che ho:
Mathieu @ evangeneer: ~ / progetti / nopair $ fanno
Ricompilare: src / risorse / user_resource
src / risorse / user_resource.erl: 22: errore di sintassi prima: ''
src / risorse / user_resource.erl: 6: funzione user_exists / 2 non definito make:
*** [Erl] errore 1
Soluzione
Sulla linea problema:
U#user.details.name == "mat"
Si sta tentando di accedere al record user_details
ma non nominarlo. Prova ...
(U#user.details)#user_details.name == "mat"
Dalla mia esperienza, il compilatore non capire da solo che # user.details è un #user_details.
Altri suggerimenti
Credo che la ragione più comune codice QLC non sarebbe la compilazione è se hai lasciato fuori il file di intestazione ti viene richiesto di inserire nei moduli contenenti query qlc. Provate ad aggiungere il seguente al modulo e vedere se risolve il problema:
-include_lib("stdlib/include/qlc.hrl").