Sqlalchemy - 由关系领域组成

时间:2013-04-26 03:37:41

标签: sqlalchemy

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

我会有2个型号A,B

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

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

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

我曾尝试使用group_by但最后却以[(A,B),(A,B),(A,B),...]

结束

注意:我不想简单地迭代所有的a然后查询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的。

1 个答案:

答案 0 :(得分:2)

不,您只需使用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