Подтвердить что ты не робот

Как динамически указывать имя столбца из строковой переменной в sql alchemy filter?

Я хочу создать запрос в 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)
4b9b3361

Ответ 1

Просто используйте getattr стандартную библиотечную функцию python, чтобы получить атрибут по имени:

col_name = 'subject'
db_session.query(Notice).filter(getattr(Notice, col_name).like("%" + query + "%"))

Ответ 2

В более новой версии sqlalchemy это должно быть сделано следующим образом:

Notice.__table__.c[col_name]

Так:

(db_session
    .query(Notice)
    .filter(Notice.__table__.c[col_name].like("%" + query + "%")
)

Ответ 3

Принятый ответ имеет решение, но устаревшее.

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'))

Ответ 4

Я попробовал решение @vans, но оно не сработало. Я всегда получал AttributeError с жалобой на то, что в моей таблице не было этого столбца. То, что работало для меня, было table.columns:

getattr(Notice.columns,col_name)