13

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
4

2 に答える 2

6

対象となる SQL は、次のように簡単に生成できます。

db.session.query(Session, func.count(Run.id)).\
    outerjoin(Run).\
    group_by(Session.id).\
    order_by(Session.id.desc())
于 2018-04-12T10:51:31.693 に答える