我想在sql炼金术过滤器中创建查询,但是变量/变量中的列是(动态的)。
原始查询:
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)
答案 0 :(得分:45)
只需使用getattr标准python库函数按名称获取属性:
col_name = 'subject'
db_session.query(Notice).filter(getattr(Notice, col_name).like("%" + query + "%"))
答案 1 :(得分:3)
在较新的sqlalchemy版本中,应该这样做:
Notice.__table__.c[col_name]
所以:
(db_session
.query(Notice)
.filter(Notice.__table__.c[col_name].like("%" + query + "%")
)
答案 2 :(得分:0)
我尝试了@vans解决方案,但没有成功。我总是收到一个AttributeError,抱怨我的表没有该列。对我有用的是table.columns
:
getattr(Notice.columns,col_name)
答案 3 :(得分:-1)
可接受的答案有解决方案,但是已经过时了。
SQLAlchemy 1.3建议将所有文本过滤器与text()
一起放在and
中。
Docs
示例:session.query(User).filter(text("id<224")).order_by(text("id")).all()
文档中的另一个example来自另一个查询
>>> 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'))