2013-04-26 44 views
4

我希望構造有這樣的事情SQLAlchemy的 - 集團通過關係域

我有2個車型查詢,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的。

+0

@slashdottir:請你說明你的意思*更好*?你的用例是什麼? – van 2015-07-23 18:56:37

+0

我有一個非常複雜的存儲過程,我需要將其轉換爲sqla,並且可以方便地讓代碼執行調用者所要求的操作,例如,不需要後處理結果 – slashdottir 2015-07-27 18:27:50

+0

請在您找到好的。但是我認爲小的Python代碼可能比存儲過程更具可讀性。 – van 2015-07-27 20:17:30

回答

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