从mnesia获取场地

时间:2011-04-21 16:59:07

标签: erlang mnesia

我有一个带有用户和密码字段的mnesia表users

我桌上的数据:

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

我需要通过用户名获取密码。我做了:

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

但它会返回[]

如何按用户名获取密码?

4 个答案:

答案 0 :(得分:0)

您没有指定正在使用的记录语法,但它看起来像

-record(users,{username,password})。

......或类似的东西。所以,假设在创建表时,你是否做了一些特殊的设置id?在此示例中,“用户名”(用户记录中的第一个条目)默认情况下应为id,除非您执行了特殊操作。

如果仍有问题,请考虑使用mnesia:match_object / 1或/ 3。您可以在模式/记录语法中指定必须匹配的部分(在本例中为用户名),并使用 =''来匹配您不知道或不关心的任何内容(在这种情况下) ,这是密码部分。

我希望有所帮助!

答案 1 :(得分:0)

您可以执行以下操作:


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

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

希望数据正确写入mnesia:)

答案 2 :(得分:0)

看看这个功能:


-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的好处是表格是否碎片化,答案是否正常。 祝你好运

答案 3 :(得分:0)

我知道您希望尽快检查密码,但是您的项目是否需要optimize这个阶段?

我的一个项目中有一个身份验证模块,我的目标与您的相似。由于我还没有机会优化,我正在使用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 shell后。

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 shell中的以下命令显示它的工作方式如何。

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

我希望我能帮到你。