2017-11-11 145 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