回答

收藏

SQLAlchemy:在查询父级时汇总所有子级列属性?

技术问答 技术问答 122 人阅读 | 0 人回复 | 2023-09-12

我之间有许多对一的关系Team和League' F' Z, b9 Z0 ]
下面的代码加入表,订单联赛由goals_for每个team在league:$ p7 ?- a; \; K& Z
for league in League.query.join(League.teams).order_by(desc(Team.goals_for)):5 f5 i+ ]- g$ c% ~* Z( ^; S2 `
    total_goals = 0
: O7 U$ R. y, I# W% y: z    for team in league.teams:
9 R5 A4 W: i/ I% P        total_goals += team.goals_for
+ G( M4 x) n, F& l    print("Total goals scored in", league.full_name, "is", total_goals)
5 R& g0 _7 l# \  p$ C正确产生:8 F4 C- I8 S; `! X0 s

/ |4 a5 U+ Z- u德国德甲联赛的总进球数是22
4 K3 r; A; N2 L# |# v8 d英超联赛的总进球数是15( B% x- H" H$ E' b8 w2 r
% T0 A: Q/ x( k1 v
我想知道两件事:
" |. T. m  z" E1 M[ol]
/ C! m7 `) N( U# ]0 `鉴于这teams基本上是一个列表,因此没有total_goals属于每个team实例的列表,有没有办法在team没有for循环的情况下求和目标值?
5 v7 E$ J9 X+ x9 l; b: D
0 a+ d- s+ }" {1 t. i/ n* b8 ^如果可能为1,是否比上面的for循环更快/更好?
7 t/ x$ X0 ]- U1 v$ w5 U( I# I% c4 D/ P# K% I* m) |
[/ol]
' C- h( |1 I2 }. D1 g               
6 [9 K; t( a) L6 Z4 R解决方案:
/ d( i1 V% ^2 I% ]9 @  U               
9 v3 q* {  O  d4 i6 o: r
! c7 B, Q1 P* o; {9 d/ k
; V4 `0 F8 X6 o1 n9 M/ |                为什么不尝试直接从SQL查询中获取聚合结果,并避免从数据库中检索额外的数据并加载整个关系树。
, e7 z: t9 U9 |) k以下应该给你一个想法:' f! @4 R, _- Q' Q" x
from sqlalchemy import func! D: w$ {) h, i# t
q = (! R2 g, w5 P1 G" C. O: ~4 J$ ?) O
    session& H% o8 z; u" ]: `' O: A4 m+ J0 T' |
    .query(League.full_name, func.sum(Team.goals_for).label("total_goals"))
3 P5 S8 h4 D* q- e0 a, F    .join(Team, League.teams)! K. j/ T9 n8 I# C/ j, [% r1 t
    .group_by(League.full_name)
7 p3 G) X8 a! P2 x)
. _5 ?7 W3 O9 h4 @2 ^$ y5 Bfor full_name, total_goals in q:
# x9 G3 k% D! O, _; w4 X% \) o    print("Total goals scored in", full_name, "is", total_goals)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则