Программно генерировать алхимию sql?

#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()