Получить поле из мнезии

У меня есть таблица мнений users с полем пользователя и пароля.

Данные из моей таблицы:

[{users, <<"user_name">>, <<"password">>}].

Мне нужно получить пароль по имени пользователя. Я делаю:

mnesia:dirty_read({users, <<"user_name">>}).

Но он возвращает [].

Как я могу получить пароль по имени пользователя?


person 0xAX    schedule 21.04.2011    source источник


Ответы (4)


Вы не указали синтаксис записи, который вы используете, но похоже

-record(пользователи, {имя пользователя, пароль}).

... или что-то подобное. Итак, если предположить, что при создании таблицы вы делали что-то особенное для установки идентификатора? В этом примере «имя пользователя» (первая запись в записи пользователей) должно быть идентификатором по умолчанию, если вы не сделали что-то особенное.

Если у вас по-прежнему возникают проблемы, рассмотрите возможность использования mnesia:match_object/1 или /3. Вы указываете в синтаксисе шаблона/записи ту часть, которую вы должны сопоставить (в данном случае имя пользователя), и используете ='' для сопоставления со всем, что вам не известно или что вас не волнует (в данном случае , это будет часть пароля).

Надеюсь, это поможет!

person greymouser    schedule 21.04.2011

Вы можете сделать что-то вроде ниже:


YourPasswd = mnesia:ets(fun()-> mnesia:dirty_read({users,UserId}) end),

    case YourPasswd of
            [] -> {error, 'No User Found'};
            [{users,_UserID,Passwd}] ->
                {success, Passwd}
    end.

Надеюсь, данные правильно записаны в мнезию :)

person Arunmu    schedule 22.04.2011

посмотрите на эту функцию:


-define(TABLE_NAME,users).

get_password_by_username(Username)-> 
     F = fun(U)-> mnesia:read({?TABLE_NAME,U}) end,
     mnesia:activity(transaction,F,[Username],mnesia_frag).

Это даст вам результат. Хорошая вещь с mnesia:activity/4 заключается в том, что независимо от того, фрагментирована таблица или нет, ответы в порядке. удачи

person Muzaaya Joshua    schedule 22.04.2011

Насколько я понимаю, вы хотите, чтобы ваши пароли проверялись как можно быстрее, но находится ли ваш проект на этапе, когда вам необходимо оптимизировать это?

У меня есть модуль аутентификации в одном из моих проектов, и у меня такие же цели, как и у вас. Поскольку у меня еще не было возможности оптимизировать, я использую транзакции mnsesia и списки для имен пользователей и паролей.

Вот часть моего модуля авторизации.

-module(auth).

-export([init/1, add_user/2, start_session/2]).
-record(auth_user, {username, password}).

init(Nodes) ->
    mnesia:create_table(auth_user,
        [{disc_copies, Nodes},
        {attributes, record_info(fields, auth_user)}]).

add_user(Username, Password) ->
    T = fun() -> 
    mnesia:write(#auth_user {
                username = Username,
                password = Password})
    end,
    mnesia:transaction(T).

start_session(Username, Password) ->
    T = fun() ->
        mnesia:read(auth_user, Username)
    end,
    {atomic, Ret} = mnesia:transaction(T),
    case Ret of
    [U] ->
        if (U#auth_user.password == Password) ->
            true;
        true ->
            false
        end;
    _Else ->
        false
    end.

После компиляции и запуска оболочки erlang.

Eshell V5.8.3  (abort with ^G)
1> mnesia:create_schema([node()]).
ok
3> mnesia:start().
ok
4> auth:init([node()]).
{atomic,ok}
5> auth:add_user("rodericktaylor", "password").
{atomic,ok}
6> true = auth:start_session("rodericktaylor", "password").
true
7>

Чтобы увидеть, возникает ли у меня та же проблема, что и у вас, я переключился на двоичные значения и сделал грязное чтение.

start_session_dirty(Username, Password) ->
    case mnesia:dirty_read(auth_user, Username) of
    [U] ->
        if (U#auth_user.password == Password) ->
            true;
        true ->
            false
        end;
    _Else ->
        false
    end.

Следующие команды в оболочке erl показывают, что он работает так, как вы ожидаете.

12> auth:add_user(<<"rodericktaylor">>, <<"binarypassword">>).            
{atomic,ok}
14> true = auth:start_session_dirty(<<"rodericktaylor">>, <<"binarypassword">>).
true
15>

Надеюсь, я помог.

person Roderick Taylor    schedule 27.04.2011