我有以下查询调用:
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))
最佳答案
您使用 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()
关于python - 我可以在查询调用中动态更改 order_by 属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140859/