SQLAlchemy de Rejoindre la sous-requête en question
Je suis en train de traduire SQL dans SQLAlchemy. La version SQL de la requête que je veux est comme suit:
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
Mon SQLAlchemy requête est comme suit:
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()
J'obtiens une erreur AttributeError: 'Alias' object has no attribute 'Bill'
Si je ajuster la SQLAlchemy requête à la suivante:
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))
résultats = requête.tous les()
J'obtiens une erreur AttributeError: Bill
Toute aide serait appréciée, merci!
Vous devez vous connecter pour publier un commentaire.
Une fois que vous appelez
subquery()
, il n'y a pas d'accès à objets, mais uniquement à des colonnes via.c.{column_name}
accesseur.Effectuez les opérations suivantes pour
sub_query
à la place: charger uniquement les colonnes dont vous avez besoin afin d'éviter toute confusion de nom:Puis dans votre recherche, utilisez les noms de colonne avec
.c.column_name
:with_entities()