如何在sqlalchemy ORM查询中使用NOT IN子句

nut*_*les 50 python mysql 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`)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有这个sqlalchemy:

query = session.query(table_a, table_b)
query = query.filter(table_a.id == table_b.id)
Run Code Online (Sandbox Code Playgroud)

Sla*_*kov 60

试试这个:

subquery = session.query(table_c.id)
query = query.filter(~table_a.id.in_(subquery))
Run Code Online (Sandbox Code Playgroud)

注:table_a,table_b并且table_c应该被映射类,而不是Table实例.

  • 这也适用于`query = query.filter(table_a.id.notin_(subquery))` (21认同)

fed*_*qui 45

ORM内部描述了notin_()运算符,因此您可以说:

query = query.filter(table_a.id.notin_(subquery))
#                               ^^^^^^
Run Code Online (Sandbox Code Playgroud)

来自文档:

继承自notin_()方法ColumnOperators

实施NOT IN运营商.

这相当于使用否定ColumnOperators.in_(),即~x.in_(y).

  • 这也适用于代替子查询的简单列表.即"不是_([42,43,44,45])` (5认同)

nut*_*les 13

这是完整的代码:

#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))
Run Code Online (Sandbox Code Playgroud)