python - SqlAlchemy 中的查询对象是不可变的吗?
问题描述
假设我收到这样的查询...
baseQuery = MyDbObj.query.filter_by(someProp='foo')
如果稍后我用其他东西扩展该查询(比如说,另一个过滤器)......
derivedQuery = baseQuery.filter_by(anotherProp='bar')
这会导致原始查询在内部被修改,还是创建一个新的查询实例?
背景:我的用例是我得到了多个案例,这些案例仅在一个过滤器中有所不同。现在有大量复制粘贴的查询代码(不是我的错,我继承了这个代码库),我正在清理它们。对于最终只执行一个查询的情况,我不在乎原始查询是否被修改。但是,我也有执行两个查询的情况,因此重要的是我可以从基本查询扩展两个查询,而不会相互干扰。
尽管这里的解决方案可能是在 python 本身中进行过滤,而不是首先对数据库进行两次查询(我将其保留为第二个选项)。
解决方案
SQLAlchemy 在过滤时创建一个副本。所以当你这样做时
derivedQuery = baseQuery.filter_by(anotherProp='bar')
然后是应用了过滤器derivedQuery
的副本。baseQuery
有关更多详细信息,请参阅文档。
推荐阅读
- javascript - 如何移动一个 div 代替另一个?
- sql-server - 我可以内部加入以前的 SQL 查询然后执行计数吗
- android - drawableLeft/Right 等不适用于 Theme.MaterialComponents
- spring-security - CustomPermissionEvaluator 与数据库
- python-3.x - 重新采样具有相同随机状态的两个相同大小的矩阵会导致相同索引的行吗?
- twitter-bootstrap - 如何在默认情况下或刷新后(不在点击时)在引导导航栏中设置活动项目
- c# - 检索完整的嵌套标签组
- flutter - Dart 中的货币格式(按区域设置)
- java - ProcessBuilder 在 Mac OS 中找不到 python3
- android - 如何在sqlite中创建具有复合主键的表?