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}.
Во-первых, не забудьте скомпилировать код .erl в .beam следующим образом.
$ erlc *.erl
Запустите оболочку 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
Вот скриншот оболочки Erlang: