web-dev-qa-db-ja.com

sqlalchemy ORMクエリでNOT IN句を使用する方法

次の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)
43
nuttynibbles

これを試して:

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

注意: table_atable_bおよびtable_cは、Tableインスタンスではなく、マップされたクラスでなければなりません。

59

ORM内部は notin_() 演算子を記述するため、次のように言えます。

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

ドキュメントから:

notin_()ColumnOperators のメソッドから継承

_NOT IN_演算子を実装します。

これは、 ColumnOperators.in_() 、つまり~x.in_(y)で否定を使用するのと同等です。

38
fedorqui

完全なコードは次のとおりです。

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