【问题标题】:Creating erlang record from two separate lists从两个单独的列表创建 erlang 记录
【发布时间】:2019-04-14 10:14:48
【问题描述】:

在我们的一个 erlang 项目中,我们使用 mysql-otp 从 mysql 数据库加载数据,如下所示 -

{ok, Columns, Rows} = mysql:query(ConnectionPid, <<"SELECT * FROM credentials WHERE username = ?">>, [Username])

现在Columns 是包含所有列名的二进制文件列表,Rows 是记录列表列表。

例如。

Columns = [<<"id">>, <<"username">>, <<"password">>, <<"is_active">>]
Rows = [[1,"test_user_1", "password", 'Y'], [2, "test_user_2", "password", 'Y']]

现在我们想在加载时将 mysql 记录缓存到 ets 表中。所以我们需要从上述两个列表中创建记录。

例如。我们有以下记录声明

-record(credentials, {id, username, password, is_active}).

那么如何从以上两个列表ColumnsRows创建credentials记录列表。有什么想法吗?

编辑

我们不能使用list_to_tuple 函数,因为Rows 列表中的元素数量可能比credentials 不同

【问题讨论】:

  • 您不能在运行时创建记录,它们是在编译时创建的。改用地图。
  • 如果你有记录定义credentials,那么列列表是无关紧要的,所以你的问题问得不好。
  • @7stud 我希望你没有得到我的问题。无论如何,我已经以我的方式解决了它,并且工作正常。
  • @Neel:如果你解决了,请在这里发布答案让其他人知道。

标签: mysql erlang


【解决方案1】:

如果您在Rows 中的数据与[Id,Username,Password,IsActive|_] 中的值始终可以预期是有序的并且其他额外的值将尾随它们的方式是一致的,那么您将不需要@ 987654323@ 提到的@ 7stud 在帖子的 cmets 中。

这是我对列表理解的处理方式:

Creds = [ #credentials{
                 id=Id,
                 username=Usr,
                 password=Pw,
                 is_active=Act} || [Id,Usr,Pw,Act|_] <- Rows ]

_ 意味着我们会忽略可能不适合 credentials 形状的任何额外值。

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 2017-06-10
    • 2011-02-12
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多