【问题标题】:SQLAlchemy Joining with subquery issueSQLAlchemy加入子查询问题
【发布时间】:2015-07-30 10:31:53
【问题描述】:

我正在尝试将 SQL 转换为 SQLAlchemy。我想要的查询的SQL版本如下:

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

我的 SQLAlchemy 查询如下:

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

我收到一个错误AttributeError: 'Alias' object has no attribute 'Bill'

如果我将 SQLAlchemy 查询调整为以下内容:

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

结果 = query.all()

我收到一个错误AttributeError: Bill

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    一旦调用subquery(),就无法访​​问对象,只能通过.c.{column_name} 访问器访问列。

    sub_query 执行以下操作:仅加载您需要的列以避免任何名称冲突:

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

    然后在您的查询中使用带有.c.column_name 的列名:

    query = query.outerjoin(
        sub_query, and_(
            sub_query.c.personId == CalendarEventAttendee.personId, 
            sub_query.c.eventId == CalendarEventAttendee.eventId)
        )
    results = query.all()
    

    【讨论】:

    • 如何覆盖要取回的列?
    • @PetrusTheron 尝试使用with_entities()
    猜你喜欢
    • 2021-09-21
    • 2019-03-13
    • 2011-09-23
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多