在我们的一个 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}).
那么如何从上面两个列表Columns
和Rows
创建credentials
记录列表。有什么想法吗?
Edits
我们不能使用list_to_tuple
函数,因为Rows
列表中的元素数量可能比credentials
可变
最佳答案
如果 Rows
中的数据与 [Id,Username,Password,IsActive|_]
中的值始终保持有序一致,并且其他额外值将尾随它们,您不需要 @7stud 在帖子评论中提到的Columns
。
这是我如何处理列表理解:
Creds = [ #credentials{
id=Id,
username=Usr,
password=Pw,
is_active=Act} || [Id,Usr,Pw,Act|_] <- Rows ]
_
意味着我们会忽略任何可能不适合 credentials
形状的额外值。
关于mysql - 从两个单独的列表创建 erlang 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53249506/