динамическая фильтрация sqlalchemy
Я пытаюсь реализовать динамическую фильтрацию с использованием SQLAlchemy ORM.
Я просматривал StackOverflow и нашел очень похожий вопрос:SQLALchemy динамический filter_by
Это полезно для меня, но недостаточно.
Итак, вот пример кода, который я пытаюсь написать:
# engine - MySQL engine
session_maker = sessionmaker(bind=engine)
session = session_maker()
# my custom model
model = User
def get_query(session, filters):
if type(filters) == tuple:
query = session.query(model).filter(*filters)
elif type(filters) == dict:
query = session.query(model).filter(**filters)
return query
тогда я пытаюсь использовать его с чем-то очень похожим:
filters = (User.name == 'Johny')
get_query(s, filters) # it works just fine
filters = {'name': 'Johny'}
get_query(s, filters)
После второго запуска возникают некоторые проблемы:
TypeError: filter() got an unexpected keyword argument 'name'
Когда я пытаюсь изменить свойfilters
чтобы:
filters = {User.name: 'Johny'}
это возвращает:
TypeError: filter() keywords must be strings
Но он отлично работает для ручного запроса:
s.query(User).filter(User.name == 'Johny')
Что не так с моими фильтрами?
Кстати, похоже, что он отлично работает для случая:
filters = {'name':'Johny'}
s.query(User).filter_by(**filters)
Но, следуя рекомендациям из упомянутого поста, я пытаюсь использовать толькоfilter
.
Если это только один из возможныхfilter_by
вместоfilter
Есть ли различия между этими двумя методами?