Mnesia - Проверьте значение в любом из ключей в таблице

У меня есть мнезийная таблица "users", созданная со следующей записью

-record(users,{username,nickname,age})

Допустим, у меня есть таблица мнезии, как следующие записи

users | username | nickname | age

users | John     | baddy    | 25 

users | Monk     | John     | 26

У меня есть имя для сопоставления с таблицей... (скажем, "Джон").. Я хочу выбрать или сопоставить строки с именем "Джон" в качестве имени пользователя или псевдонима... Как я могу добиться этого? Если кто-то может предложить мне путь, я буду очень счастлив...

Спасибо

4 ответа

-module(wy).
-compile(export_all).

-record(users, {username, nickname, age}).
-include_lib("stdlib/include/ms_transform.hrl").

create_table()->
    mnesia:create_schema(node()),
    mnesia:start(),
    mnesia:create_table(users, [{attributes, record_info(fields, users)}]).

test()->
    Fun = fun()->
              mnesia:write(#users{username = "John", nickname = "baddy", age = 25}),
              mnesia:write(#users{username = "DaDa", nickname = "KaKa", age = 24}),
              mnesia:write(#users{username = "Monk", nickname = "John", age = 24})
          end,
    mnesia:transaction(Fun),

    Fun2 = ets:fun2ms(fun({users, UserName, NickName, Age}) when
                       UserName == "John" orelse NickName == "John" ->
                            {users, UserName, NickName, Age}
                  end), 

    mnesia:transaction(fun() -> mnesia:select(users, Fun2) end).

Взгляните на QLC - здесь есть простой пример на Learn You Some Erlang или на странице руководства здесь. Вы можете использовать логические значения для соответствия, например (в псевдокоде) (имя пользователя == Джон ИЛИ псевдоним == Джон).

выберите (Q)->
    case mnesia:is_transaction() из
        ложь -> 
            F = fun(QH)-> qlc:e(QH) конец,
            Mnesia: активность (транзакция,F [Q],mnesia_frag);
        true -> qlc:e(Q)
    конец.

read_by_name_or_nickname(Имя) ->
    Данные = выбор (qlc:q([X || X <- мнезия: таблица (пользователи),
        ((X # users.nsername == Name) orelse (X # users.nickname == Name))])),
    Данные.

У меня есть таблица вида ниже.

NB: имя модуля этого скрипта Erlang — <candidates_server.erl>

      -record(candidates,{
  name,
  surname,
  contestid,
  tally
}).

Я хотел прочитать количество записей (строк), заданных в конкурсе . Я построил такую ​​​​функцию:

      %-spec(read_a_candidate (Contestid::binary()) ->  {succeed,{Records_counter :: pos_integer(), Records_list :: list(map())}}).%
      read_a_candidate(Contestid) ->
  F = fun() ->
    Record = #candidates{ contestid = Contestid,  _ = '_' },
    mnesia:select(candidates, [{Record, [], ['$_']}])
                      end,
  {atomic,ResultList}=mnesia:activity(transaction,F),
  {succeed,length(ResultList),ResultList}.

  1. Во-первых, не забудьте скомпилировать код .erl в .beam следующим образом.

                 $ erlc *.erl 
    
  2. Запустите оболочку Erlang,

             $ erl -mnesia dir '"./dir/to/file/path"' -pa /ebin -name\
      client_0@127.0.0.1 -setcookie 'candidates_secret_cookie' -kernel\     
      candidates_server init shell_history enabled
    
  3. Вот скриншот оболочки Erlang:

Другие вопросы по тегам