【问题标题】:How to execute "left outer join" in SqlAlchemy如何在 SqlAlchemy 中执行“左外连接”
【发布时间】:2014-11-26 08:22:38
【问题描述】:

我需要执行这个查询::

select field11, field12
from Table_1 t1
left outer join Table_2 t2 ON t2.tbl1_id = t1.tbl1_id
where t2.tbl2_id is null

我在 python 中有这些类:

class Table1(Base):
   ....

class Table2(Base):
   table_id =  Column(
        Integer,
        ForeignKey('Table1.id', ondelete='CASCADE'),
    )
    ....

我如何从下面到达上面?

【问题讨论】:

    标签: python sql sqlalchemy


    【解决方案1】:
    q = session.query(Table1.field1, Table1.field2)\
        .outerjoin(Table2)\ # use in case you have relationship defined
        # .outerjoin(Table2, Table1.id == Table2.table_id)\ # use if you do not have relationship defined
        .filter(Table2.tbl2_id == None)
    

    应该这样做,假设 field1field2 来自 Table1,并且您定义了一个关系:

    class Table2(Base):
        # ...
        table1 = relationship(Table1, backref="table2s")
    

    【讨论】:

    • 如果 Table1 和 Table2 是同一张表,有没有办法做到这一点?
    • 当然可以。阅读文档的Using Aliases 部分。
    【解决方案2】:

    您也可以仅使用 SQLAlchemy Core 来做到这一点:

    session.execute(
        select(['field11', 'field12'])
        .select_from(
            Table1.outerjoin(Table2, Table1.tbl1_id == Table2.tbl1_id))
        .where(Table2.tbl2_id.is_(None))
    )
    

    PS .outerjoin(table, condition) 等同于 .join(table, condition, isouter=True)

    【讨论】:

    • 还有Table1.outerjoin(Table2, Table1.tbl1_id == Table2.tbl1_id)
    • 这里为什么需要where子句?这不是将您限制在 Table2 中 ID 为空的那些记录吗?如果你不包含 where 子句,你最终会得到一个完整的外连接吗?
    • 查看问题。 @Roosh 想过滤掉该字段。对于完全外部连接,您应该在调用中添加 full=True。
    猜你喜欢
    • 2017-01-29
    • 2019-08-10
    • 2018-02-10
    • 2018-04-08
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多