您好,我想了解 sqlalchemy 延迟加载是如何工作的?假设我有这个查询
results = (
session.query(Parent).
options(lazyload(Parent.children)).
filter(Parent.id == 1).
all()
)
for parent in results:
logging.error(parent.children)
我想知道如果我在for循环中访问parent.children,这会创建一个新的select语句吗?或者记录或parent.children 是否已缓存或其他什么?我正在考虑这将如何影响性能。我只是想要最优化的方式。
- 我应该使用延迟加载吗?
- 访问循环中的每个项目将创建一个新的 sqlalchemy
- 如何查明 sqlalchemy 是否正在运行查询? (只是想知道访问每个条目是否会创建一个选择语句
最佳答案
- 也许吧。
- 您的意思是发出新查询吗?答案是yes ,这就是
lazyload()
的要点。关系集合属性是在第一次访问时延迟填充的。另一方面,如果您希望避免可能的 N+1 情况,您可以使用joinedload()
相反,为了在同一查询中填充子项。 - 使用logging 。在您的引擎配置中传递
echo=True
。
关于python - SQLAlchemy LazyLoading 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47241641/