SQLAlchemy динамический фильтр запросов - PullRequest
0 голосов
/ 04 октября 2018

Я застрял в этой проблеме поиска в базе данных: у меня есть виджет PyQt5 с различными флажками.Каждый из них представляет собой столбец из моей базы данных.Например, «имя_работника» и «отдел».Чекбоксы располагаются рядом с lineEdits, поэтому пользователь вставляет некоторый текст в этот lineEdit, а затем нажимает на кнопки checkBox и «Найти».

Допустим, пользователь вставляет «John» в lineEdit, чем нажимает «работник_имя» checkBox и получаетвсе документы этого работника через

session.query(Doc).filter_by('worker_name'=text_from_lineEdit)

Если пользователь вставит текст в оба lineEdits и нажал оба запроса checkBoxes ('worker_name' и 'Department'), будет выглядеть так:

session.query(Doc).filter_by('worker_name'=text_from_lineEdit, 'department'=text_from_lineEdit_2)

Но что, если у меня есть много checkBoxes (столько же, сколько столбцов в таблице БД), и я не знаю, какие из них будут нажаты, а какие нет.Как мне сформировать запрос в этом случае?Я имею в виду, что у меня будет 'wrk_name', 'Department' и 'date', и пользователь сможет искать только по 'worker_name' или 'worker_name' + 'date' или со всеми чекбоксами.

Есть ли какие-либоспособ динамически формировать запрос к базе данных, основываясь на том, какие аргументы заданы, а какие нет, чтобы включать их в фильтр 'filter_by' / 'или просто игнорировать.

Пожалуйста, поделитесь своими идеями о возможной реализации такой функциональности.Спасибо за ваше время.

1 Ответ

0 голосов
/ 05 октября 2018

Просто помните, что в python все является объектом, поэтому вы можете динамически создавать список фильтров и передавать его в метод filter () (или любой другой).Несколько псевдокодов для иллюстрации концепции:

flist = []
for inp in input:
    flist.append(Table.column == inp.property)

db.query(Table).filter(*flist)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...