2015-05-18 12 views
5

Próbuję przetłumaczyć SQL na SQLAlchemy. Wersja SQL kwerendy chcę się następująco:SQLAlchemy Łączenie z zagadnieniem podkwerendy

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 

Moje zapytanie SQLAlchemy jest następujący:

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

ja otrzymuję błąd AttributeError: 'Alias' object has no attribute 'Bill'

Gdybym dopasować zapytanie sqlalchemy do następujące:

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

wyniki = zapytanie.all()

Wystąpił błąd AttributeError: Bill

Każda pomoc byłaby doceniona, dzięki!

Odpowiedz

10

Po wywołaniu subquery(), nie ma dostępu do obiektów, ale tylko do kolumny za .c.{column_name} akcesor.

Wykonaj następujące czynności dla sub_query Zamiast: ładować tylko kolumn potrzebne w celu uniknięcia kolizji nazwa:

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

Następnie w swoich nazwach kolumn użytku frazę .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

Jak zrobić zastępujesz kolumny, które chcesz odzyskać? –

+0

@PetrusTheron: Nie rozumiem pytania? – van