web-dev-qa-db-fra.com

Comment utiliser la clause NOT IN dans la requête sqlalchemy ORM

comment convertir la requête mysql suivante en 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`)

jusqu'à présent, j'ai ceci pour sqlalchemy:

query = session.query(table_a, table_b)
query = query.filter(table_a.id == table_b.id)
43
nuttynibbles

Essaye ça:

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

Remarque: table_a, table_b et table_c doivent être des classes mappées, pas des instances Table.

59
Slava Bacherikov

Les internes ORM décrivent l'opérateur notin_() , vous pouvez donc dire:

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

De la documentation:

hérité de la méthode notin_() de ColumnOperators

implémentez l'opérateur NOT IN.

Cela équivaut à utiliser la négation avec ColumnOperators.in_() , c'est-à-dire ~x.in_(y).

38
fedorqui

voici le code complet:

#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