2015-05-18 7 views
5

Ich versuche SQL in SQLAlchemy zu übersetzen. Die SQL-Version der Abfrage I will wie folgt:SQLAlchemy Join mit Subquery-Problem

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 

Meine SQLAlchemy Abfrage lautet wie folgt:

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

Ich erhalte einen Fehler AttributeError: 'Alias' object has no attribute 'Bill'

Wenn ich die SQLAlchemy Abfrage anpassen, um die folgenden:

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

ergebnisse = query.all()

Ich erhalte einen Fehler AttributeError: Bill

Jede Hilfe dank würde geschätzt!

Antwort

10

Sobald Sie subquery() nennen, gibt es keinen Zugang zu Objekte, sondern nur auf Spalten über .c.{column_name} Accessor.

die für sub_query stattdessen folgende Optionen: nur Last der Spalten, die Sie benötigen, um alle Namenskollisionen zu vermeiden:

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

Dann in Ihren Abfrage verwenden Spaltennamen mit .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

Wie Überschreiben Sie die Spalten, die Sie zurück erhalten möchten? –

+0

@PetrusTheron: Ich verstehe die Frage nicht? – van

Verwandte Themen