【问题标题】:Flask-sqlalchemy - count different group categories in a single queryFlask-sqlalchemy - 在单个查询中计算不同的组类别
【发布时间】:2019-09-03 04:31:34
【问题描述】:

我正在尝试获取 SQLAlchemy 查询中不同对象类别的计数。 我的数据被组织成 3 个表格:

class Meeting(db.Model):
    __tablename__ = 'meetings'
    id = db.Column(db.Integer,
                   primary_key=True)
    submissions = db.relationship('Submission',
                        backref='timeslot',
                        lazy=True)

class Submission(db.Model):
    __tablename__ = 'submissions'
    id = db.Column(db.Integer,
           primary_key=True,
           nullable=False)
    meeting_id =  db.Column(db.Integer,
            db.ForeignKey('meetings.id'),
                        nullable=False)
    _type = db.relationship('Act_types', lazy=True)
    _type_id = db.Column(db.Integer, db.ForeignKey('acttypes.id'), Nullable=False)


class Act_types(db.Model):
    __tablename__ = 'acttypes'
    id = db.Column(db.Integer, primary_key=True)
    action_type = db.Column(db.String(60))

逻辑如下: 用户为特定的Meeting 制作Submissions。每个Submission 都属于一个特定的Act_type

Meeting->Submission->Act_Type

对于每个Meeting,我想获取有关存在多少特定类型的提交的信息。

Meeting -> Act_Type1-> count
Meeting -> Act_Type2-> count

我想通过 SQLAlchemy 查询获取信息,而不是使用循环。

目前,在数据库中,我有一个会议对象,6 个提交属于 2 种类型:

<Meeting 1>
[<Submission 1>, <Submission 2>, <Submission 3>, <Submission 4>, <Submission 5>, <Submission 6>]
[<Act_types 1>, <Act_types 2>]

如果我做一个简单的选择查询,我会得到以下结果:

subs = db.session.query(Meeting, Submission, Act_types).\
    filter(Meeting.id == self.id).\
    order_by(Act_types.action_type).\
    group_by(Act_types.action_type).\
    all()

> [(<Meeting 1>, <Submission 6>, <Act_types 2>), (<Meeting 1>, <Submission 6>, <Act_types 1>)]

我尝试了Group by & count function in sqlalchemy,但它没有给我想要的结果,只是计算了Act_Types 条目的数量。

<Meeting 1>
[(<Meeting 1>, <Submission 6>, <Act_types 2>, 6), (<Meeting 1>, <Submission 6>, <Act_types 1>, 6)]

所需的输出类似于:

[(<Meeting 1>, <Act_types 2>, 4), (<Meeting 1>, <Act_types 1>, 2)]

我如何做到这一点?

【问题讨论】:

    标签: python group-by count sqlalchemy


    【解决方案1】:

    由于Act_types.action_type 不是键(主键或唯一键),因此您不能按它分组并选择所有操作类型列,因为它们不是由Act_type.action_type 确定的——结果将是不确定的。相反,您可以将选择限制为单独的操作类型。此外,您需要加入才能将会议与提交和操作类型相关联:

    subs = db.session.query(Meeting, Act_types.action_type, func.count()).\
        join(Submission, Meeting.submissions).\
        join(Act_types).\
        filter(Meeting.id == self.id).\
        order_by(Meeting.id, Act_types.action_type).\
        group_by(Meeting.id, Act_types.action_type).\
        all()
    

    GROUP BY 子句中的 Meeting.id 可能看起来是多余的,因为最终您只选择了一个会议,但对于数据库来说,选择 1 或全部没有区别,因此您必须包含它。另一方面,由于您已经拥有会议对象(您正在使用其id 属性),您可以从选择列表中省略它:

    subs = db.session.query(Act_types.action_type, func.count()).\
        select_from(Submission).\
        join(Act_types).\
        filter(Submission.meeting_id == self.id).\
        order_by(Act_types.action_type).\
        group_by(Act_types.action_type).\
        all()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-23
      • 2021-05-07
      • 2022-01-24
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多