How to execute "left outer join" in SqlAlchemy
Question:
I need to execute this query::
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
I had these classes in python:
class Table1(Base):
....
class Table2(Base):
table_id = Column(
Integer,
ForeignKey('Table1.id', ondelete='CASCADE'),
)
....
How do I get to the above from the below?
Answers:
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)
should do it, assuming that field1
and field2
are from Table1
, and that you define a relationship:
class Table2(Base):
# ...
table1 = relationship(Table1, backref="table2s")
You can also do that using SQLAlchemy Core only:
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)
is equivalent to .join(table, condition, isouter=True)
.
I need to execute this query::
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
I had these classes in python:
class Table1(Base):
....
class Table2(Base):
table_id = Column(
Integer,
ForeignKey('Table1.id', ondelete='CASCADE'),
)
....
How do I get to the above from the below?
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)
should do it, assuming that field1
and field2
are from Table1
, and that you define a relationship:
class Table2(Base):
# ...
table1 = relationship(Table1, backref="table2s")
You can also do that using SQLAlchemy Core only:
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)
is equivalent to .join(table, condition, isouter=True)
.