2013-02-28 22 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() 
相關問題