SQLAlchemy Eager加载关系

时间:2016-03-08 18:10:32

标签: python sqlalchemy relationships

在以下场景中尝试(并且失败)了解如何使用SQLAlchemy:

假设我有一个数据库:

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

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

如果我想循环通过给出A的所有B,我可以这样做:

for b in a.bs:
    print "hello"

如果我想遍历所有间接属于A的C,我可以这样做:

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

但是,我知道最外层循环的每次迭代都会执行一个新的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"

这是最干净的方式吗?

是否有一些语法可以让我从实际的'a'对象开始。也许是这样的事情:

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

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

你可以echo f | xcopy /y "$(TargetPath)" "$(SolutionDir)ProjOne\bin\Debug$(TargetFileName)" 这样的任意连接路径:

subqueryload

这会使用三个查询,并会为session.query(A).options(subqueryload(A.b).subqueryload(B.c)) 中的每个A.b加载B.cB