【问题标题】:How can I turn the results from this joined query into dict based on one of the key values?如何根据其中一个键值将此联接查询的结果转换为 dict?
【发布时间】:2016-07-30 01:39:21
【问题描述】:

对不起,我对这一切有点陌生。

我正在使用 psycopg2、python 和 postgres。

我有两个表 - 用户和事件。我已经建立了多对多的关系,因为一个活动可以有很多用户并且用户可以加入很多活动。有一个名为 UsersEvents 的中间表将用户 ID 与事件 ID 匹配。我想在与此类似的字典中获取事件和用户列表:

[
    {
        event_id: 1,
        event_name : 'event-name',
        joined : [
            {'username' : 'name'},
            {'username' : 'name'},
            {'username' : 'name'}
        ]
    },
    {
        event_id: 2,
        event_name : 'event2-name',
        joined : [
            {'username' : 'name2'},
            {'username' : 'name2'}
        ]
    }
]

我正在使用 psycopg2 运行这样的查询,以获取事件列表和与之关联的用户:

SELECT events.id, event_name, users.username
FROM events
JOIN usersevents on events_id = events.id
JOIN users on usersevents.users_id = users.id;

返回给我的是这样的:

[
    (1, 'event-name', 'name'),
    (1, 'event-name', 'name'), 
    (1, 'event-name', 'name'), 
    (2, 'event2-name', 'name2'),
    (2, 'event2-name', 'name2')
]

所以很高兴它能提取我需要的信息,但现在我必须尝试弄清楚如何将它合并到上面的格式中。对于我正在尝试做的事情,是否有更好的查询,或者我应该遍历所有结果并尝试合并具有相同事件名称的结果?

编辑:我了解如何将结果作为字典返回,如 cmets 中指出的那样。我想获取具有重复事件名称的行,并将加入该事件的用户嵌套到单个事件对象的单个 dict 行中。

【问题讨论】:

  • 你说的你想要的格式,其实不是字典,而是字典列表。

标签: python psycopg2


【解决方案1】:

您希望按名称为每个事件构建数据结构。创建一个将名称映射到事件数据的字典。对于每一行,创建或更新事件的数据。最后,dict 中的值是事件数据列表。

for id, event, user in results:
    event = events.setdefault(id, {'event_id': id, 'event_name': name, 'joined': []})
    event['joined'].append({'username': user})

data = list(events.values())

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多