我正在用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表达式语言外,我一无所知。
答案 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没有实际的布尔类型,但是有人可能会争辩说最好不要依赖隐式强制,并且这种方式的代码更可移植。请注意,如果两行或更多行匹配相同数量的谓词,则它们的顺序是不确定的。