Как использовать предложение NOT IN в запросе ORM sqlalchemy

как преобразовать следующий запрос 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)

Ответ 1

Попробуй это:

subquery = session.query(table_c.id)
query = query.filter(~table_a.id.in_(subquery))

Примечание: table_a, table_b и table_c должны быть сопоставлены классам, а не экземплярам Table.

Ответ 2

Внутренние ORM описывают оператор notin_(), поэтому вы можете сказать:

query = query.filter(table_a.id.notin_(subquery))
#                               ^^^^^^

Из документов:

унаследованный от notin_() метода ColumnOperators

реализуйте оператор NOT IN.

Это эквивалентно использованию отрицания с помощью ColumnOperators.in_(), т.е. ~x.in_(y).

Ответ 3

вот полный код:

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