2015-05-18 12 views
5

Sto cercando di tradurre SQL in SQLAlchemy. La versione di SQL della query che voglio è la seguente:SQLAlchemy Partecipare con il problema di subquery

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 

La mia domanda SQLAlchemy è la seguente:

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

sto ottenendo un errore AttributeError: 'Alias' object has no attribute 'Bill'

Se ho regolare la query SQLAlchemy a il seguente:

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

ottengo un errore AttributeError: Bill

Qualsiasi aiuto sarebbe apprezzato, grazie!

risposta

10

Una volta che si chiama subquery(), non v'è alcun accesso a oggetti, ma solo per le colonne tramite .c.{column_name} di accesso.

fare quanto segue per sub_query invece: carico solo le colonne è necessario al fine di evitare eventuali collisioni nome:

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

Poi nei nomi delle colonne di utilizzo di query con .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

Come fare hai scavalcato le colonne che vuoi recuperare? –

+0

@PetrusTheron: non capisco la domanda? – van