Python SQLAlchemy:查询父列时求所有子列属性的和?
我在Python SQLAlchemy:查询父列时求所有子列属性的和?,python,sql,sqlalchemy,flask-sqlalchemy,Python,Sql,Sqlalchemy,Flask Sqlalchemy,我在团队和联盟 以下代码加入表格,并按照该联盟中每个团队的目标对联盟进行排序: for league in League.query.join(League.teams).order_by(desc(Team.goals_for)): total_goals = 0 for team in league.teams: total_goals += team.goals_for print("Total goals scored in", league.f
团队
和联盟
以下代码加入表格,并按照该联盟中每个团队的目标对联盟进行排序:
for league in League.query.join(League.teams).order_by(desc(Team.goals_for)):
total_goals = 0
for team in league.teams:
total_goals += team.goals_for
print("Total goals scored in", league.full_name, "is", total_goals)
正确产生:
德国德甲总进球数为22个
英超联赛的总进球数是15个
我想知道两件事:
鉴于团队
基本上是一个列表,因此没有属于每个团队
实例的总目标
,有没有一种方法可以在没有for循环的情况下对团队
目标的值求和
如果1是可能的,它是否比上面的for循环更快/更好
为什么不尝试直接从SQL
查询中获取聚合结果,并避免从数据库中检索额外数据和加载整个关系树
下面应该给你一个想法:
from sqlalchemy import func
q = (
session
.query(League.full_name, func.sum(Team.goals_for).label("total_goals"))
.join(Team, League.teams)
.group_by(League.full_name)
)
for full_name, total_goals in q:
print("Total goals scored in", full_name, "is", total_goals)
为什么不尝试直接从SQL
查询中获取聚合结果,并避免从数据库中检索额外数据和加载整个关系树
下面应该给你一个想法:
from sqlalchemy import func
q = (
session
.query(League.full_name, func.sum(Team.goals_for).label("total_goals"))
.join(Team, League.teams)
.group_by(League.full_name)
)
for full_name, total_goals in q:
print("Total goals scored in", full_name, "is", total_goals)
你试过sum(联赛球队)
吗?应该更快*因为sum
是用C.*YMMV实现的,但是我需要每个团队的目标,而不是团队的数量。对不起,误读了发生的事情sum(team.goals\u代表联赛中的团队。teams)
大致相当,但作为生成器表达式并使用sum
。这不就是所谓的理解吗,只是一个更快的for循环吗?(说得很像noob?)理解和生成器表达式不一样。有关这方面的更多详细信息,请参阅。它们通常更快,因为它们不会将所有项目都保存在内存中。因此,如果只使用一次值,则生成器表达式可能是最佳的。或许可以阅读一下。您是否尝试过sum(联赛球队)
?应该更快*因为sum
是用C.*YMMV实现的,但是我需要每个团队的目标,而不是团队的数量。对不起,误读了发生的事情sum(team.goals\u代表联赛中的团队。teams)
大致相当,但作为生成器表达式并使用sum
。这不就是所谓的理解吗,只是一个更快的for循环吗?(说得很像noob?)理解和生成器表达式不一样。有关这方面的更多详细信息,请参阅。它们通常更快,因为它们不会将所有项目都保存在内存中。因此,如果只使用一次值,则生成器表达式可能是最佳的。我之所以选择这个是因为我经常在SQLAlchemy线程中看到你的名字,但我不得不承认我不太明白我们如何避免整个关系树。我知道没有人加入,但是我们怎么才能得到这个团队呢?这种查询的“好的经济性”来自哪里?好的经济性来自这样一个事实,即这只是对数据库的一个SQL
查询。实际上,这里需要连接,所以这显然是我的疏忽。我会修正的,谢谢。我仍然不明白在我原来的帖子里附加的问题在哪里。(另外:无法通过您的个人资料与您联系,我很愿意为一个项目雇用您)根据关系League.teams
的配置(例如,是否使用joinedload
),您的第一次查询将不会加载Team
对象。只有通过league.teams
(代码的第3行)访问时,才会发出另一个SQL
查询。您可以通过记录SQL
语句(engine.echo=True
)来检查这一点。但是,即使您的关系是自动加载的,我认为在数据库中计算每个联盟的一个总数要比在python代码中快得多。另外,数据库和代码之间的数据传输更小。我之所以选择这个选项,是因为我经常在SQLAlchemy线程中看到您的名字,但我必须承认,我不太明白我们如何避免整个关系树。我知道没有人加入,但是我们怎么才能得到这个团队呢?这种查询的“好的经济性”来自哪里?好的经济性来自这样一个事实,即这只是对数据库的一个SQL
查询。实际上,这里需要连接,所以这显然是我的疏忽。我会修正的,谢谢。我仍然不明白在我原来的帖子里附加的问题在哪里。(另外:无法通过您的个人资料与您联系,我很愿意为一个项目雇用您)根据关系League.teams
的配置(例如,是否使用joinedload
),您的第一次查询将不会加载Team
对象。只有通过league.teams
(代码的第3行)访问时,才会发出另一个SQL
查询。您可以通过记录SQL
语句(engine.echo=True
)来检查这一点。但是,即使您的关系是自动加载的,我认为在数据库中计算每个联盟的一个总数要比在python代码中快得多。另外,数据库和代码之间的数据传输更小。