SQLAlchemy - упорядочить список выбора по количеству удовлетворяющих ему предложений or_ - PullRequest
0 голосов
/ 26 сентября 2018

Я пишу Программу на Python 3.6, которая взаимодействует с Базой данных на SQLite.

Я пропускаю несколько серий предложений или_ в моем select () .where(или _) .Есть ли способ упорядочить список (это результат моего выбора) по количеству предложений or_, которым он удовлетворяет ??

Это пример:

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

Я быкак программа, чтобы выбрать любой элемент в моей базе данных, который имеет один из трех параметров.Но я бы хотел заказать все предметы по номеру или пунктам, которые они насытят.Поэтому, если файл имеет все три параметра, он находится наверху моего списка.

Я не знаю ничего, кроме языка выражений SQL в SQLAlchemy.

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете привести результаты булевых выражений в виде целых чисел и сложить их:

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 не имеет фактического логического типа, но можноутверждают, что лучше не полагаться на неявное принуждение, и код более переносим.Обратите внимание, что если 2 или более строк соответствуют одинаковому количеству предикатов, их порядок не определен.

...