Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:查询父列时求所有子列属性的和?_Python_Sql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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代码中快得多。另外,数据库和代码之间的数据传输更小。