2015-05-18 50 views
5

我正在嘗試將SQL轉換爲SQLAlchemy。我想要查詢的SQL版本如下:SQLAlchemy加入子查詢問題

SELECT * from calendarEventAttendee 
JOIN calendarEventAttendanceActual ON calendarEventAttendanceActual.id = calendarEventAttendee.attendanceActualId 
LEFT JOIN 
    (SELECT bill.id, bill.personId, billToEvent.eventId FROM bill JOIN billToEvent ON bill.id = billToEvent.billId) b 
    ON b.eventId = calendarEventAttendee.eventId AND b.personId = calendarEventAttendee.personId 
WHERE b.id is NULL 

我SQLAlchemy的查詢如下:

query = db.session.query(CalendarEventAttendee).join(CalendarEventAttendanceActual) 

sub_query = db.session.query(Bill, BillToEvent).join(BillToEvent, BillToEvent.billId == Bill.id).subquery() 
query = query.outerjoin(sub_query, and_(sub_query.Bill.personId == CalendarEventAttendee.personId, Bill.eventId == CalendarEventAttendee.eventId)) 
results = query.all() 

我得到一個錯誤AttributeError: 'Alias' object has no attribute 'Bill'

如果我調整SQLAlchemy的查詢如下:

sub_query = db.session.query(Bill, BillToEvent).join(BillToEvent, BillToEvent.billId == Bill.id).subquery() 
query = query.outerjoin(sub_query, and_(sub_query.Bill.personId == CalendarEventAttendee.personId, sub_query.BillToEvent.eventId == CalendarEventAttendee.eventId)) 

results = query.all()

我得到一個錯誤AttributeError: Bill

任何幫助將不勝感激,謝謝!

回答

10

一旦您撥打subquery(),就無法訪​​問對象,但只能通過.c.{column_name}訪問器訪問列。

執行以下操作爲sub_query代替:

sub_query = db.session.query(
     Bill.id, Bill.personId, BillToEvent.eventId 
    ).join(BillToEvent, BillToEvent.billId == Bill.id).subquery() 

然後在查詢中使用的列名與.c.column_name

query = query.outerjoin(
    sub_query, and_(
     sub_query.c.personId == CalendarEventAttendee.personId, 
     sub_query.c.eventId == CalendarEventAttendee.eventId) 
    ) 
results = query.all() 
+0

如何做負載只有你需要爲了避免名稱衝突列你重寫你想要回來的列? –

+0

@PetrusTheron:我不明白這個問題? – van