【问题标题】:Get field from mnesia从 mnesia 获取字段
【发布时间】:2011-08-10 11:27:59
【问题描述】:

我有一个 mnesia 表 users,其中包含用户和密码字段。

我表中的数据:

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

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

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

但它返回[]

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

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

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

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

    ... 或类似的东西。所以,假设当你创建表时,你做了什么特别的事情来设置 id?在这个例子中,“用户名”(用户记录中的第一个条目)应该是默认的 id,除非你做了什么特别的事情。

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

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      您可以执行以下操作:

      YourPasswd = mnesia:ets(fun()-> mnesia:dirty_read({users,UserId}) end), 案例 YourPasswd 的 [] -> {错误,'未找到用户'}; [{users,_UserID,Passwd}] -> {成功,密码} 结尾。

      希望数据正确写入mnesia :)

      【讨论】:

        【解决方案3】:

        看看这个函数:

        -定义(TABLE_NAME,用户)。 get_password_by_username(用户名)-> F = fun(U)-> mnesia:read({?TABLE_NAME,U}) 结束, mnesia:activity(transaction,F,[用户名],mnesia_frag)。

        那会给你结果。 mnesia:activity/4 的好处是无论表格是否碎片化,答案都可以。 祝你好运

        【讨论】:

          【解决方案4】:

          我了解您希望尽快检查您的密码,但您的项目是否处于需要optimize this 的阶段?

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

          我希望我有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-20
            • 2018-09-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-14
            • 2020-08-19
            • 2011-01-30
            相关资源
            最近更新 更多