Как выполнить "левое внешнее соединение" в 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

У меня были эти классы в python:

class Table1(Base):
   ....

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

Как мне перейти к приведенному выше из ниже?

Ответы

Ответ 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)

должен сделать это, считая, что field1 и field2 - из Table1, и что вы определяете отношение:

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

Ответ 2

Вы также можете сделать это, используя только SQLAlchemy Core:

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