2017-11-11 137 views
1

您好我想了解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或什么?我正在考虑这将如何影响性能。我只是想最优化的方式。

  1. 我应该使用lazyloading吗?
  2. 访问循环中的每个项目是否会创建新的sqlalchemy
  3. 如何查看sqlalchemy是否正在运行查询? (只是想看看每个条目访问将创建一个select语句

回答

1
  1. 可能。
  2. 你的意思是发出一个新的查询呢?答案是yes,这就是lazyload()点。关系集合属性在第一次访问时会被填充,如果另一方面您希望避免可能出现的N + 1情况,您可以使用joinedload()来代替相同查询中的子项。在您的引擎配置中通过echo=True
相关问题