gpt4 book ai didi

python - sqlalchemy 动态过滤

转载 作者:太空狗 更新时间:2023-10-29 21:28:12 31 4
gpt4 key购买 nike

我正在尝试使用 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 = {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,那么这两种方法有什么区别吗?

最佳答案

您的问题是 filter_by 采用关键字参数,但 filter 采用表达式。因此,为 filter_by **mydict 扩展字典将起作用。对于过滤器,您通常会向它传递一个参数,该参数恰好是一个表达式。因此,当您将 **filters dict 扩展到过滤器时,您向过滤器传递了一堆它不理解的关键字参数。

如果您想从存储的过滤器参数的字典中构建一组过滤器,您可以使用查询的生成特性来继续应用过滤器。例如:

# assuming a model class, User, with attributes, name_last, name_first
my_filters = {'name_last':'Duncan', 'name_first':'Iain'}
query = session.query(User)
for attr,value in my_filters.iteritems():
query = query.filter( getattr(User,attr)==value )
# now we can run the query
results = query.all()

上述模式的优点在于您可以在多个连接的列中使用它,您可以使用 and_ 和 or_ 构造“ands”和“ors”,您可以进行 <= 或日期比较,等等。它比使用带关键字的 filter_by 灵活得多。唯一需要注意的是,对于连接,您必须小心一点,不要不小心尝试连接一个表两次,并且您可能必须为复杂的过滤指定连接条件。我在一个非常复杂的域模型上使用它进行一些非常复杂的过滤,它就像一个魅力,我只是保持一个 entities_joined 的字典来跟踪连接。

关于python - sqlalchemy 动态过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41305129/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com