2013-02-28 47 views
4

我有以下查询电话:我可以在查询调用中动态更改order_by属性吗?

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() 
) 

我希望能够在ORDER_BY条款定义调用.query(之前),这可能吗?

我试图做为this stackoverflow answer建议为过滤器规范,但我不知道如何创建filter_group语法。

从该职位:

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

回答

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() 
相关问题