假设我有SQL Alchemy ORM类:
class Session(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_agent = db.Column(db.Text, nullable=False)
class Run(db.Model):
id = db.Column(db.Integer, primary_key=True)
session_id = db.Column(db.Integer, db.ForeignKey('session.id'))
session = db.relationship('Session', backref=db.backref('runs', lazy='dynamic'))
我想查询以下内容:
((session.id, session.user_agent, session.runs.count())
for session in Session.query.order_by(Session.id.desc()))
但是,这显然是1 + n查询,这很糟糕。使用1个查询执行此操作的正确方法是什么?在普通的SQL中,我会使用以下内容执行此操作:
SELECT session.id, session.user_agent, COUNT(row.id) FROM session
LEFT JOIN rows on session.id = rows.session_id
GROUP BY session.id ORDER BY session.id DESC
答案 0 :(得分:9)
构造一个子查询,用于对运行中的会话ID进行分组和计数,并加入到最终查询中的会话ID。
sq = session.query(Run.session_id, func.count(Run.session_id).label('count')).group_by(Run.session_id).subquery()
result = session.query(Session, sq.c.count).join(sq, sq.c.session_id == Session.id).all()
答案 1 :(得分:4)
目标SQL可以简单地使用:
生成db.session.query(Session, func.count(Run.id)).\
outerjoin(Run).\
group_by(Session.id).\
order_by(Session.id.desc())