如何在SqlAlchemy中执行"左外连接"

Roo*_*osh 38 python sql sqlalchemy

我需要执行这个查询::

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
Run Code Online (Sandbox Code Playgroud)

我在python中有这些类:

class Table1(Base):
   ....

class Table2(Base):
   table_id =  Column(
        Integer,
        ForeignKey('Table1.id', ondelete='CASCADE'),
    )
    ....
Run Code Online (Sandbox Code Playgroud)

我如何从下面得到上述内容?

van*_*van 59

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)
Run Code Online (Sandbox Code Playgroud)

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

class Table2(Base):
    # ...
    table1 = relationship(Table1, backref="table2s")
Run Code Online (Sandbox Code Playgroud)

  • 你当然可以.阅读文档的[使用别名](http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#using-aliases)部分. (2认同)

mac*_*iek 8

您也可以仅使用SQLAlchemy Core执行此操作:

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

PS .outerjoin(table, condition)相当于.join(table, condition, isouter=True).

  • 还有`Table1.outerjoin(Table2,Table1.tbl1_id == Table2.tbl1_id)`. (3认同)