2015-05-18 14 views
5

Tôi đang cố dịch SQL thành SQLAlchemy. Phiên bản SQL của truy vấn tôi muốn là như sau:SQLAlchemy Tham gia với sự cố truy vấn phụ

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 

truy vấn SQLAlchemy của tôi là như sau:

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() 

Tôi nhận được một lỗi AttributeError: 'Alias' object has no attribute 'Bill'

Nếu tôi điều chỉnh truy vấn SQLAlchemy để như sau:

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()

Tôi gặp lỗi AttributeError: Bill

Mọi trợ giúp sẽ được đánh giá cao, cảm ơn!

Trả lời

10

Khi bạn gọi subquery(), không có quyền truy cập vào đối tượng, nhưng chỉ cho các cột qua số .c.{column_name} accessor.

Làm như sau để sub_query thay vì: tải chỉ các cột mà bạn cần để tránh bất kỳ xung đột tên:

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

Sau đó, trong tên cột sử dụng truy vấn của bạn với .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

thế nào bạn ghi đè các cột bạn muốn quay lại? –

+0

@PetrusTheron: Tôi không hiểu câu hỏi? – van

Các vấn đề liên quan