SQLAlchemy查询结果的重新排序基于外部排名

时间:2012-05-17 16:16:39

标签: python sqlalchemy

ORM查询的结果(例如,MyObject.query())需要根据基于不在数据库内的值(即来自单独的搜索引擎)的排序算法来排序。这意味着'order_by'将不起作用,因为它只对数据库中的字段进行操作。

但是,我不想将查询结果转换为列表,然后重新排序,因为我希望保持为查询添加更多约束的能力。 E.g:

results = MyObject.query()
results = my_reorder(results)
results = results.filter(some_constraint)

这可以通过SQLAlchemy完成吗?

1 个答案:

答案 0 :(得分:2)

我担心你将无法做到这一点,除非可以从数据库中 的对象表和/或相关对象表的字段派生排序

但您可以从代码中返回元组(query, order_func/result)。在这种情况下,查询可以继续扩展,直到它被执行,然后求助。或者你可以创建一个类似于Proxy的小类,它将包含这个元组,并将查询扩展方法委托给查询,并将查询执行方法(all(), __iter__,...)委托给执行时查询并应用排序。

此外,如果您可以预先计算每个MyObject实例的值,则可以使用值为查询添加literal列,然后使用order_by按顺序排序。或者,添加临时表,添加具有计算排序值的行,在查询中连接它并添加排序。但我认为这些增加的复杂性超过了它们带来的好处。