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