Flask-SQLAlchemy count в подзапросе - PullRequest
1 голос
/ 24 сентября 2019

У меня есть две таблицы:

class Records(db.Model):
    year = db.Column(db.Integer, nullable=False)
    team_id = db.Column(db.Integer, nullable=False)
    owner_id = db.Column(db.String, nullable=False)
    wins = db.Column(db.Integer, nullable=False)
    losses = db.Column(db.Integer, nullable=False)
    db.PrimaryKeyConstraint(year, team_id, name="records_year_team_id_pkey")

class Champions(db.Model):
    year = db.Column(db.Integer, nullable=False)
    owner_id = db.Column(db.String, nullable=False)
    db.PrimaryKeyConstraint(year, name="champions_year_pkey")

Я пытаюсь преобразовать этот запрос в эквивалент ORM:

select
  r.owner_id,
  sum(r.wins) as wins,
  sum(r.losses) as losses,
  round(sum(r.wins)::decimal/(sum(r.wins)+sum(r.losses)), 4) as win_percentage,
  (select count(1) from champions where owner_id = r.owner_id) as championships
from
  records r
group by
  r.owner_id
order by
  win_percentage desc;

Это то, что я пока имею, но не знаю, каксделать часть подзапроса:

standings = db.session \
    .query(Records.owner_id.label("owner_id"),
        func.sum(Records.wins).label("wins"),
        func.sum(Records.losses).label("losses"),
        (func.sum(cast(Records.wins, Numeric)) / (func.sum(Records.wins) + func.sum(Records.losses))).label("win_percentage"),
        func.count(1).filter(Champions.owner_id == Records.owner_id)) \ # not correct
    .group_by(Records.owner_id) \
    .order_by(desc("win_percentage")) \
    .all()

Каким будет эквивалент ORM для подзапроса?

(select count(1) from champions where owner_id = r.owner_id) as championships
...