在我们的一个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}).
那么如何从上面两个列表credentials
和Columns
中创建Rows
记录的列表。有想法吗?
编辑
我们不能使用list_to_tuple
函数,因为Rows
列表中的元素数量可能比credentials
答案 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 ]
意味着我们忽略了可能不适合_
形状的任何多余值。