首页 > 解决方案 > SqlAlchemy 中的查询对象是不可变的吗?

问题描述

假设我收到这样的查询...

baseQuery = MyDbObj.query.filter_by(someProp='foo')

如果稍后我用其他东西扩展该查询(比如说,另一个过滤器)......

derivedQuery = baseQuery.filter_by(anotherProp='bar')

这会导致原始查询在内部被修改,还是创建一个新的查询实例?

背景:我的用例是我得到了多个案例,这些案例仅在一个过滤器中有所不同。现在有大量复制粘贴的查询代码(不是我的错,我继承了这个代码库),我正在清理它们。对于最终只执行一个查询的情况,我不在乎原始查询是否被修改。但是,我也有执行两个查询的情况,因此重要的是我可以从基本查询扩展两个查询,而不会相互干扰。

尽管这里的解决方案可能是在 python 本身中进行过滤,而不是首先对数据库进行两次查询(我将其保留为第二个选项)。

标签: pythonsqlalchemy

解决方案


SQLAlchemy 在过滤时创建一个副本。所以当你这样做时

derivedQuery = baseQuery.filter_by(anotherProp='bar')

然后是应用了过滤器derivedQuery的副本。baseQuery有关更多详细信息,请参阅文档


推荐阅读