SQLAlchemy-按其满足的or_子句数排序选择列表

时间:2018-09-26 10:16:35

标签: python sqlalchemy sql-order-by

我正在用Python 3.6编写一个程序,该程序与SQLite中的数据库进行通讯。

我在 select().where(or _)中通过了多个 or _ 子句。 有什么方法可以通过它满足的or_子句的数量来排序列表(这是我的选择的结果)?

这是一个示例:

result5 = conn.execute(select([mytable]).where(or_( mytable.c.filename == myfile , mytable.c.id ==  3 , mytable.c.date == mydate ))) 

我希望程序选择数据库中具有三个参数之一的任何项目。但是我希望按它们满足的数字或或子句对所有项目进行排序。因此,如果文件具有所有三个参数,那么它将出现在列表的顶部。

除了SQLAlchemy的SQL表达式语言外,我一无所知。

1 个答案:

答案 0 :(得分:0)

您可以将布尔表达式的结果转换为整数并将它们相加:

from functools import reduce
import operator

preds = [mytable.c.filename == myfile,
         mytable.c.id == 3,
         mytable.c.date == mydate]
stmt = select([mytable]).\
    where(or_(*preds)).\
    order_by(reduce(operator.add, [p.cast(Integer) for p in preds]).desc())

result5 = conn.execute(stmt)

在SQLite中,甚至可能不需要强制转换,因为SQLite没有实际的布尔类型,但是有人可能会争辩说最好不要依赖隐式强制,并且这种方式的代码更可移植。请注意,如果两行或更多行匹配相同数量的谓词,则它们的顺序是不确定的。