2013-05-28 18 views
1

在加載初始對象之後是否可以啓動深度加載?SqlAlchemy,在初始加載後深度預加載

例如,下面是巨大的:

session.query(Foo).options(joinedload('bars.bazs')).all() 

但是,如果我已經有foo什麼?

foo = session.query(Foo).first() 
if foo.something: 
    do_nothing() 
else: 
    # <- would now like to eagerload 'bars.bazs' 
    for bar in foo.bars: 
     for baz in bar.bazs: 
      # this is lazily loaded and slow 

任何方式來做到這一點?

回答

1

據我所見,你已經在做你在第一個例子中所要求的。

session.query(Foo).options(joinedload('bars.bazs')).all() 

這將只加載Foo對象以開始。只有當您訪問Foo.bars屬性時,它纔會加載所有Bar對象的所有Bar對象和所有Baz對象。

如果你想eagerload與初始查詢的所有富,酒吧和巴茲對象,你就必須像這樣指定它:在最後

session.query(Foo).options(joinedload_all('bars.bazs')).all() 

文檔:

session.query(Foo).options(joinedload('bars'), joinedload('bars.bazs')).all() 

或更短部分this section

要調查如何在逐步執行代碼時從DB加載對象,可以將echo=True傳遞給create_engine()調用。

+0

啊,超級,仔細閱讀你提到的文檔,行爲是明確的。 – EoghanM