【发布时间】:2017-05-09 09:02:46
【问题描述】:
我正在尝试使用 SQLAlchemy ORM 实现动态过滤。
我正在查看 StackOverflow 并发现非常相似的问题:SQLALchemy dynamic 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,这两种方法有什么区别吗?
【问题讨论】:
标签: python dynamic sqlalchemy filtering