2016-03-08 7 views
0

пытается (и отсутствии), чтобы обернуть вокруг головы, как использовать SQLAlchemy в следующем сценарии:SQLAlchemy Нетерпеливый Загрузка с Отношения

Предположим, у меня есть базы данных, такие, что:

A has a (one -> many) relationship to B 

B has a (one -> many) relation to C 

Если я хочу перебрать все Б дано А, я могу сделать:

for b in a.bs: 
    print "hello" 

Если я хочу, чтобы перебрать все C-х, что косвенно принадлежат А, я могу сделать:

for b in a.bs: 
    for c in b.cs: 
     print "hello" 

Однако я знаю, что каждая итерация цикла out-most будет выполнять свежий SQL-запрос.

Я из понимания того, что я могу использовать subqueryload, чтобы предотвратить это, выполнив:

for b in session.query(b).options(subqueryload(B.c)).filter_by(B.a_id == a.id): 
    for c in b.cs: 
     print "hello" 

Разве что tidiest способ сделать это?

Нет ли синтаксиса, который позволяет мне начать с фактического объекта «a». Возможно, что-то вроде:

for b in a.bs.options(subqueryload(B.c)): 
    ... 

Большое спасибо заранее за вашу помощь

ответ

0

Вы можете subqueryload произвольный присоединиться этот путь:

session.query(A).options(subqueryload(A.b).subqueryload(B.c)) 

Это использует три запроса и загрузит A.b и B.c за каждые B в A.b.

+0

Спасибо за этот univerio. Если бы мне нужны только строки, косвенно связанные с моим объектом «a», мне нужно было бы сделать фильтр, как в моем ответе выше, правильно? Если это так, я не могу запросить непосредственно из свойства отношения объекта 'a'. Например: a.bs.options (... Я надеюсь, что это имеет смысл. – maambmb

+0

@maambmb О, я думаю, что неправильно понял ваш оригинальный вопрос. Если у вас есть только один объект 'A', и вы хотели получить' Ab' с 'Bc' загружается в каждом «B», у вас есть возможность сделать фильтр, как вы описали выше, или выполнить цепочку подзапросов (как в моем ответе) * при первом запросе для этого объекта 'A'. Если вы хотите сделать' aboptions', вы должны настроить 'Ab' как' lazy = "dynamic" '. Это заставляет' Ab' возвращать 'Query' вместо списка, который имеет свои плюсы и минусы. – univerio

+0

большое спасибо за очистку этого для меня это очень ценится! – maambmb

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