2013-05-28 3 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 и все объекты Baz для всех объектов Bar.

Если вы хотите eagerload всех объектов Foo, Bar и БАЗ с первоначальным запросом вы должны указать это так:

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

или короче:

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

документация в последнем часть this section.

Чтобы узнать, как объекты загружаются из БД при переходе по вашему коду, вы можете передать echo=True на ваш вызов create_engine().

+0

Ah super, еще одно тщательное чтение документов, с которыми вы ссылаетесь, и поведение ясное. – EoghanM

Смежные вопросы