我可以在查询调用中动态更改order_by属性吗?

时间:2013-02-28 16:39:28

标签: python sqlalchemy pyramid

我有以下查询电话:

SearchList = (DBSession.query(
    func.count(ExtendedCDR.uniqueid).label("CallCount"),
    func.sum(ExtendedCDR.duration).label("TotalSeconds"),
    ExtendedCDR,ExtensionMap)
    .filter(or_(ExtensionMap.exten == ExtendedCDR.extension,ExtensionMap.prev_exten == ExtendedCDR.extension))
    .filter(between(ExtendedCDR.start,datebegin,dateend))
    .filter(ExtendedCDR.extension.in_(SelectedExtension))
    .group_by(ExtendedCDR.extension)
    .order_by(func.count(ExtendedCDR.uniqueid).desc()))
    .all()
)

我希望能够在调用.query()之前定义order_by子句,这可能吗?

我尝试按照this stackoverflow answer建议过滤规范,但我不知道如何创建filter_group语法。

从那篇文章:

filter_group = list(Column.in_('a','b'),Column.like('%a'))
query = query.filter(and_(*filter_group))

1 个答案:

答案 0 :(得分:4)

您使用DBSession.query()调用构建SQL查询,并且在您调用.all()之前不会执行此查询。

您可以存储中间结果并根据需要添加更多过滤器或其他子句:

search =DBSession.query(
    func.count(ExtendedCDR.uniqueid).label("CallCount"),
    func.sum(ExtendedCDR.duration).label("TotalSeconds"),
    ExtendedCDR,ExtensionMap)
search = search.filter(or_(
    ExtensionMap.exten == ExtendedCDR.extension,
    ExtensionMap.prev_exten == ExtendedCDR.extension))
search = search.filter(between(ExtendedCDR.start, datebegin, dateend))
search = search.filter(ExtendedCDR.extension.in_(SelectedExtension))
search = search.group_by(ExtendedCDR.extension)
search = search.order_by(func.count(ExtendedCDR.uniqueid).desc())

您传递给order_by的值可以提前创建:

search_order = func.count(ExtendedCDR.uniqueid).desc()

然后用作:

search = search.order_by(search_order)

查询完成后,请致电.all()

获取结果
SearchList = search.all()