Ответ 1
Просто используйте getattr стандартную библиотечную функцию python, чтобы получить атрибут по имени:
col_name = 'subject'
db_session.query(Notice).filter(getattr(Notice, col_name).like("%" + query + "%"))
Я хочу создать запрос в sql alchemy filter, но столбец (динамический) в переменной/указан в переменной.
Исходный запрос:
db_session.query(Notice).filter(Notice.subject.like("%" +query+ "%"))
Я хочу сделать запрос следующим образом:
col_name='subject'
db_session.query(Notice).filter(Notice.col_name.like("%" +query+ "%"))
col_name='status'
status=0
db_session.query(Notice).filter(Notice.col_name != 1)
Просто используйте getattr стандартную библиотечную функцию python, чтобы получить атрибут по имени:
col_name = 'subject'
db_session.query(Notice).filter(getattr(Notice, col_name).like("%" + query + "%"))
В более новой версии sqlalchemy это должно быть сделано следующим образом:
Notice.__table__.c[col_name]
Так:
(db_session
.query(Notice)
.filter(Notice.__table__.c[col_name].like("%" + query + "%")
)
Принятый ответ имеет решение, но устаревшее.
SQLAlchemy 1.3 предлагает поместить все текстовые фильтры в text()
, соединенные с and
. Документы
Пример: session.query(User).filter(text("id<224")).order_by(text("id")).all()
Еще один пример из документации по другому запросу
>>> s = select([
... text("users.fullname || ', ' || addresses.email_address AS title")
... ]).\
... where(
... and_(
... text("users.id = addresses.user_id"),
... text("users.name BETWEEN 'm' AND 'z'"),
... text(
... "(addresses.email_address LIKE :x "
... "OR addresses.email_address LIKE :y)")
... )
... ).select_from(text('users, addresses'))
Я попробовал решение @vans, но оно не сработало. Я всегда получал AttributeError с жалобой на то, что в моей таблице не было этого столбца. То, что работало для меня, было table.columns
:
getattr(Notice.columns,col_name)