【问题标题】:SQLAlchemy with count, group_by and order_by using the ORM使用 ORM 的带有 count、group_by 和 order_by 的 SQLAlchemy
【发布时间】:2010-09-27 01:51:35
【问题描述】:

我有几个函数需要使用 count()、group_by 和 order_by 进行一对多连接。我正在使用 sqlalchemy.select 函数来生成一个查询,该查询将返回一组 id,然后我对其进行迭代以对各个记录进行 ORM 选择。我想知道是否有一种方法可以在单个查询中使用 ORM 来完成我需要做的事情,这样我就可以避免进行迭代。

这是我现在正在做的一个例子。在这种情况下,实体是位置和指南,一对多映射。我正在尝试获取按相关指南数量排序的热门地点列表。

def popular_world_cities(self):
    query = select([locations.c.id, func.count(Guide.location_id).label('count')],
                   from_obj=[locations, guides],
                   whereclause="guides.location_id = locations.id AND (locations.type = 'city' OR locations.type = 'custom')",
                   group_by=[Location.id],
                   order_by='count desc',
                   limit=10)
    return map(lambda x: meta.Session.query(Location).filter_by(id=x[0]).first(), meta.engine.execute(query).fetchall())

解决方案

我找到了最好的方法。只需提供 from_statement 而不是 filter_by 或类似的。像这样:

meta.Session.query(Location).from_statement(query).all()

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    我发现这很难,但 SQLAlchemy 确实支持group_by。 Query 下的文档没有这么说,但它确实支持它——我用过!

    而且,您还可以使用order_by。我打算像你一样创建一个特殊的类/查询,但后来我发现有一个 group_by() 函数。

    【讨论】:

    • 这里的例子可能有用
    • 例如(取自heresession.query(Table.column, func.count(Table.column)).group_by(Table.column).all()
    【解决方案2】:

    您尝试执行的操作直接映射到子查询 [由您当前的选择调用生成的] 和表之间的 SQLAlchemy 连接。您需要将排序移出子选择并使用 count(desc); 创建一个单独的标记列。按该列排序外部选择。

    除此之外,我没有看到太多不明显的地方。

    【讨论】:

      【解决方案3】:

      我找到了最好的方法。只需提供 from_statement 而不是 filter_by 或类似的。像这样:

      meta.Session.query(Location).from_statement(query).all()
      

      【讨论】:

        猜你喜欢
        • 2012-01-06
        • 2019-05-04
        • 2010-12-09
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        相关资源
        最近更新 更多