2014-10-01 18 views
18

muszę wykonać to zapytanie ::Jak wykonać "left outer join" w 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 

miałem tych klas w Pythonie:

class Table1(Base): 
    .... 

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

Jak mogę dostać się do wyżej od poniżej?

Odpowiedz

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

powinien to zrobić, zakładając, że field1 i field2 są od Table1, i że można zdefiniować zależność:

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

Czy istnieje sposób, aby to zrobić, jeśli Table1 i Table2 są tymi samymi tabelami? – avyfain

+1

Pewnie, że możesz. Przeczytaj sekcję dokumentacji [Korzystanie z aliasów] (http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#using-aliases). – van

2

Można również zrobić za pomocą SQLAlchemy rdzenia tylko:

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