Ответ 1
Попробуй это:
subquery = session.query(table_c.id)
query = query.filter(~table_a.id.in_(subquery))
Примечание: table_a
, table_b
и table_c
должны быть сопоставлены классам, а не экземплярам Table
.
как преобразовать следующий запрос mysql в sqlalchemy?
SELECT * FROM 'table_a' ta, 'table_b' tb where 1
AND ta.id = tb.id
AND ta.id not in (select id from 'table_c')
до сих пор у меня это для sqlalchemy:
query = session.query(table_a, table_b)
query = query.filter(table_a.id == table_b.id)
Попробуй это:
subquery = session.query(table_c.id)
query = query.filter(~table_a.id.in_(subquery))
Примечание: table_a
, table_b
и table_c
должны быть сопоставлены классам, а не экземплярам Table
.
Внутренние ORM описывают оператор notin_()
, поэтому вы можете сказать:
query = query.filter(table_a.id.notin_(subquery))
# ^^^^^^
Из документов:
унаследованный от
notin_()
методаColumnOperators
реализуйте оператор
NOT IN
.Это эквивалентно использованию отрицания с помощью
ColumnOperators.in_()
, т.е.~x.in_(y)
.
вот полный код:
#join table_a and table_b
query = session.query(table_a, table_b)
query = query.filter(table_a.id == table_b.id)
# create subquery
subquery = session.query(table_c.id)
# select all from table_a not in subquery
query = query.filter(~table_a.id.in_(subquery))