#sqlalchemy
#sqlalchemy
Вопрос:
У меня есть форма ввода с 3 полями ввода. Пользователь может выбрать заполнение от 1 до 3 полей ввода. Я генерирую запрос SQL alchemy на основе их ввода. Если пользователь не заполнил поле, оно не должно быть частью критериев для запроса.
Я полагаю, я мог бы написать код с 7 ветвями — с запросом SQL alchemy для каждого возможного запроса (например, если пользователь заполнил поля 2 и 3, но не 1, тогда запрос выглядит так …).
Но я думаю, что был бы способ программно сгенерировать оператор SQL alchemy, чтобы избежать такого рода сложных ветвлений. Существует ли такой метод?
Ответ №1:
Просто соедините фильтры по требованию и полностью избегайте ветвления:
q = session.query(Person) # .join(...).filter(...).order_by(...)
# optional filters
if form.filter_name:
q = q.filter(Person.name == form.filter_name)
if form.filter_minimum_age:
q = q.filter(Person.minimum_age >= form.minimum_age)
if form.tag_name:
q = q.join(Tag, Person.tags).filter(Tag.name.like('%' form.tag_name '%'))
# iterate over results (only now the DB will be queried)
for person in q.all():
# do whatever
Комментарии:
1. и это выполнит только один запрос? в конце инструкций if? когда на самом деле запрашивается база данных?
2. @akh2103 когда вы получаете доступ к результатам, например, с помощью
res = q.all()