SQLAlchemy LazyLoading如何工作
问题描述:
您好我想了解sqlalchemy懒加载是如何工作的?假设我有这个疑问SQLAlchemy LazyLoading如何工作
results = (
session.query(Parent).
options(lazyload(Parent.children)).
filter(Parent.id == 1).
all()
)
for parent in results:
logging.error(parent.children)
我想知道,如果我访问了该parent.children for循环将在创建一个新的select语句?或者是已经被缓存的记录或parent.children或什么?我正在考虑这将如何影响性能。我只是想最优化的方式。
- 我应该使用lazyloading吗?
- 访问循环中的每个项目是否会创建新的sqlalchemy
- 如何查看sqlalchemy是否正在运行查询? (只是想看看每个条目访问将创建一个select语句
答
- 可能。
- 你的意思是发出一个新的查询呢?答案是yes,这就是
lazyload()
点。关系集合属性在第一次访问时会被填充,如果另一方面您希望避免可能出现的N + 1情况,您可以使用joinedload()
来代替相同查询中的子项。在您的引擎配置中通过echo=True
。