从两个单独的列表创建erlang记录

时间:2018-11-11 14:02:49

标签: mysql erlang

在我们的一个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}).

那么如何从上面两个列表credentialsColumns中创建Rows记录的列表。有想法吗?

  

编辑

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

1 个答案:

答案 0 :(得分:0)

如果您在Rows中的数据是一致的,并且可以始终期望[Id,Username,Password,IsActive|_]中的值是有序的,而其他多余的值将尾随它们,那么您就不需要{{1 }},如@ 7stud在帖子的评论中所述。

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

Columns

Creds = [ #credentials{ id=Id, username=Usr, password=Pw, is_active=Act} || [Id,Usr,Pw,Act|_] <- Rows ] 意味着我们忽略了可能不适合_形状的任何多余值。