gpt4 book ai didi

python - 如何使用 SqlAlchemy 通过联接构建计数聚合?

转载 作者:行者123 更新时间:2023-12-01 04:24:11 25 4
gpt4 key购买 nike

我有一个用户表、这些用户可能所属的组表以及用户和组之间的联接表。

这在 SQLAlchemy 中表示如下:

class User(Base):
__tablename__ = 'user'
user_id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)
email = Column(String(250), nullable=False)
groups = relationship('Group', secondary='user_group_pair')

class Group(Base):
__tablename__ = 'group'
group_id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)
date_created = Column(String(250), nullable=False)
members = relationship('User', secondary='user_group_pair')

class User_Group_Pair(Base):
__tablename__ = 'user_group_pair'
user_group_pair_id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('user.user_id'))
group_id = Column(Integer, ForeignKey('group.group_id'))
user = relationship(User, backref=backref("group_assoc"))
group = relationship(Group, backref=backref("user_assoc"))

我正在尝试解决以下简单问题:

我想编写一个查询,该查询将返回用户列表以及每个用户所属的组数。

这需要来自 User 和 User_Group_Pair 的数据(这就是为什么我的问题的标题提到连接),以及按 user_id 分组的计数聚合。

我不确定为什么这不起作用:

subq = session.query(User_Group_Pair.user_id.label('user_id'), func.count(User_Group_Pair.user_group_pair_id).label('count')).\
group_by(User_Group_Pair.user_id).order_by('count ASC').subquery()

result = session.query(User).join(subq, User.user_id == subq.user_id).all()

我收到此错误:

'Alias' object has no attribute 'user_id'

但是,请注意,我已将 User_Group_Pair.user_id 标记为“user_id”...有什么想法吗?

谢谢

最佳答案

只需将 subq.user_id 更改为 subq.c.user_id(c 代表 columns)即可它有效:

result = session.query(User).join(subq, User.user_id == subq.c.user_id).all()

但是你仍然只能得到那些至少属于一个组的用户,并且查询结果中并没有真正返回组的数量。下面的查询是解决此问题的一种方法:

q = (session.query(User, func.count(Group.group_id).label("num_groups"))
.outerjoin(Group, User.groups)
.group_by(User.user_id)
)
for b, num_groups in q:
print(b, num_groups)

关于python - 如何使用 SqlAlchemy 通过联接构建计数聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33335922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com