46

我想在 sql alchemy 过滤器中创建查询,但列是(动态)在变量中/在变量中指定。

原始查询:

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

4 回答 4

72

只需使用getattr标准 python 库函数按名称获取属性:

col_name = 'subject'
db_session.query(Notice).filter(getattr(Notice, col_name).like("%" + query + "%"))
于 2012-04-20T23:08:28.113 回答
11

在较新的 sqlalchemy 版本中,应该这样做:

Notice.__table__.c[col_name]

所以:

(db_session
    .query(Notice)
    .filter(Notice.__table__.c[col_name].like("%" + query + "%")
)
于 2018-04-17T17:12:07.823 回答
2

我尝试了@vans 解决方案,但没有奏效。我总是收到一个 AttributeError 抱怨我的表没有该列。对我有用的是table.columns

getattr(Notice.columns,col_name)
于 2019-03-04T15:03:40.910 回答
-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'))
于 2018-11-19T11:35:27.510 回答