Sqlalchemy – 由关系领域组成

我希望构建一个类似这样的查询

我会有2个型号A,B

B与A有很多对一的关系(有很多B到一个A).

我希望我的查询返回类似这样的东西[(A,[B,B,B]),(A,[B,B])等…]

其中元组的第一个元素是A类,第二个元素是与A类有关系的所有B元素的列表(或查询).

我曾试图使用group_by但它最终只是[(A,B),(A,B),(A,B),…]

注意:我不想简单地迭代所有的,然后查询B,因为A可能没有B.我想做的是

*  filter all B's by a datestamp
-> group those B's by A
-> return an iterable object tuples as described above

有没有办法在SQL语句中完成所有操作?我发现像func.count,如果我想计算每个A有多少个B,那就行了,但是我需要迭代B的.

最佳答案 不,你不能通过简单地使用group_by来实现这一点.这最好用普通的python完成:

from sqlalchemy.orm import joinedload
from collections import defaultdict

def handle_request(datestamp):
    """ Return dict(A, [Bs]) for Bs filtered by *datestamp*.  """
    qry = session.query(B).options(joinedload(B.A)).filter(B.datestamp > datestamp)
    res = defaultdict(list)
    for b in qry:
        res[b.A].append(b)
    res = dict(res)
    return res

datestamp = datetime.datetime(2001, 1, 1)
res = handle_request(datestamp)
for a, bs in res.items():
    print a, bs
点赞