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

È stato utile?

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").
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top