пытается (и отсутствии), чтобы обернуть вокруг головы, как использовать 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)):
...
Большое спасибо заранее за вашу помощь
Спасибо за этот univerio. Если бы мне нужны только строки, косвенно связанные с моим объектом «a», мне нужно было бы сделать фильтр, как в моем ответе выше, правильно? Если это так, я не могу запросить непосредственно из свойства отношения объекта 'a'. Например: a.bs.options (... Я надеюсь, что это имеет смысл. – maambmb
@maambmb О, я думаю, что неправильно понял ваш оригинальный вопрос. Если у вас есть только один объект 'A', и вы хотели получить' Ab' с 'Bc' загружается в каждом «B», у вас есть возможность сделать фильтр, как вы описали выше, или выполнить цепочку подзапросов (как в моем ответе) * при первом запросе для этого объекта 'A'. Если вы хотите сделать' aboptions', вы должны настроить 'Ab' как' lazy = "dynamic" '. Это заставляет' Ab' возвращать 'Query' вместо списка, который имеет свои плюсы и минусы. – univerio
большое спасибо за очистку этого для меня это очень ценится! – maambmb