Это не похоже на ужасно идиоматическую sqlalchemy. У вас уже есть объект Table
, который вы используете для построения запроса, вы также можете использовать его для выражения предикатов в сгенерированном предложении WHERE
, даже динамически:
date = '01.01.2011'
from_date = dt.datetime.strptime(date, "%d.%m.%Y").date()
q = session.query(Table) \
.filter(Table.c[nm].like('%%%s%%' % val) ) \
.filter(Table.c[ft] > from_date)
Во всяком случае, это главное преимущество использования sqlalchemy.
Этот шаблон распространяется почти на каждый угол sqlalchemy, например, если вы должны указать, какую таблицу выбрать для динамического выбора, это можно обработать, открыв свойство MetaData.tables
, которое также дикт.
Если вам действительно нужна полная общность выразительности, предоставляемая пользователю, вам, вероятно, будет лучше обслужить это, просто разрешив ему вводить операторы SQL. Смешение генеративных запросов в стиле sqlalchemy с введенными пользователем выражениями, вероятно, не поможет помочь вам или вашим пользователям. Возможно, вы можете использовать SQLalchemy для генерации скелетных запросов, а затем позволить пользователям редактировать их, настраивая их так, как им нужно.