Erlang 从mnesia获取字段

Erlang 从mnesia获取字段,erlang,mnesia,Erlang,Mnesia,我有一个带有用户和密码字段的mnesia表users 我的表格中的数据: [{users, <<"user_name">>, <<"password">>}]. [{users,}]。 我需要通过用户名获取密码。我提出: mnesia:dirty_read({users, <<"user_name">>}). mnesia:dirty_read({users,})。 但它返回[] 如何通过用户名获取密码?您没有指定正

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

我的表格中的数据:

[{users, <<"user_name">>, <<"password">>}].
[{users,}]。
我需要通过用户名获取密码。我提出:

mnesia:dirty_read({users, <<"user_name">>}).
mnesia:dirty_read({users,})。
但它返回
[]


如何通过用户名获取密码?

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

-记录(用户,{用户名,密码})

。。。或者类似的东西。那么,假设在创建表时,您是否做了任何特殊的操作来设置id?在本例中,“username”(users记录中的第一个条目)默认应为id,除非您做了一些特殊的操作

如果继续存在问题,请考虑使用MNESIA: MatCHYObj/Obj/2或1或3。您可以在模式/记录语法中指定必须匹配的部分(在本例中为用户名),并使用=“”匹配您不知道或不关心的任何内容(在本例中为密码部分)


我希望这有帮助

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

-记录(用户,{用户名,密码})

。。。或者类似的东西。那么,假设在创建表时,您是否做了任何特殊的操作来设置id?在本例中,“username”(users记录中的第一个条目)默认应为id,除非您做了一些特殊的操作

如果继续存在问题,请考虑使用MNESIA: MatCHYObj/Obj/2或1或3。您可以在模式/记录语法中指定必须匹配的部分(在本例中为用户名),并使用=“”匹配您不知道或不关心的任何内容(在本例中为密码部分)


我希望这有帮助

您可以执行以下操作:

YourPasswd=mnesia:ets(fun()->mnesia:dirty_read({users,UserId})end), 如你所知 []->{错误,'未找到用户'}; [{users,_UserID,Passwd}]> {成功,Passwd} 结束。


希望数据正确写入mnesia:)

您可以执行以下操作:

YourPasswd=mnesia:ets(fun()->mnesia:dirty_read({users,UserId})end), 如你所知 []->{错误,'未找到用户'}; [{users,_UserID,Passwd}]> {成功,Passwd} 结束。

希望数据正确写入mnesia:)

查看此函数:

-定义(表名称、用户)。 通过用户名(用户名)获取密码--> F=fun(U)->mnesia:read({?TABLE_NAME,U})end, mnesia:活动(事务,F,[用户名],mnesia_frag)。 这会给你结果。《记忆:活动/4》的好处在于,无论表格是否零碎,答案都是可以的。 祝你好运看看这个函数:

-定义(表名称、用户)。 通过用户名(用户名)获取密码--> F=fun(U)->mnesia:read({?TABLE_NAME,U})end, mnesia:活动(事务,F,[用户名],mnesia_frag)。 这会给你结果。《记忆:活动/4》的好处在于,无论表格是否零碎,答案都是可以的。
祝您好运

我知道您希望尽快检查密码,但您的项目是否正处于需要检查密码的阶段

我在我的一个项目中有一个身份验证模块,我的目标与你的类似。因为我还没有机会进行优化,所以我使用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>
12>验证:添加用户(,)。
{原子,好的}
14> true=auth:start\u session\u dirty(,)。
真的
15>

希望我能帮上忙。

我知道您希望尽快检查密码,但您的项目是否正处于需要检查密码的阶段

我在我的一个项目中有一个身份验证模块,我的目标与你的类似。因为我还没有机会进行优化,所以我使用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>
12>验证:添加用户(,)。
{原子,好的}
14> true=auth:start\u session\u dirty(,)。
真的
15>
我希望我帮了忙