SQLAlchemy: ¿cómo filtrar en los tipos de columna PgArray?

En postgres puros podemos escribir:

SELECT * FROM my_table WHERE 10000 = ANY (array_field); 

o

 SELECT * FROM my_table WHERE 10000 = ALL (array_field); 

¿Cómo hacer lo mismo con la ayuda de sqlalchemy sin sql sin formato?

a = ANY(b_array) es equivalente a a IN (elements_of_b_array) 1 .

Por lo tanto puedes usar el método in_() .

No recuerdo haber usado a = ALL(b_array) en todos mis años con PostgreSQL. ¿Tienes?


Si está tratando con una columna de matriz y desea probar si contiene un elemento determinado (o todos los elementos de una matriz determinada) en esa columna, entonces puede utilizar los operadores de matriz de PostgreSQL @> ( contains ) o más apropiadamente el hermano inverso <@ ( is contained by ).

Los operadores de arrays tienen la ventaja de que pueden ser soportados con un índice GIN en la columna del arsenal (a diferencia de la construcción ANY ).

Su statement SQL:

 SELECT * FROM my_table WHERE 10000 = ANY (array_field); 

es (casi) 1 equivalente a

 SELECT * FROM my_table WHERE 10000 <@ array_field; 

No soy un experto en SQLAlchemy, pero de acuerdo con el tutorial en el manual de SQLAlchemy , puede utilizar cualquier operador:

Si ha encontrado un operador que realmente no está disponible, siempre puede usar el método op() ; esto genera cualquier operador que necesites:

 >>> print users.c.name.op('tiddlywinks')('foo') users.name tiddlywinks :name_1 

Énfasis en negrita el mio Su statement podría verse así en SQLA:

 s = select([my_table], array_field.op('@>')('ARRAY[10000]')) 

O con una syntax de entrada alternativa para los valores de matriz de PostgreSQL:

 s = select([my_table], array_field.op('@>') (cast('{10000}', int[]))) 

1 Hay una diferencia sutil con el manejo NULL:

 SELECT '{NULL}'::int[] <@ ... -- that's an array with a single NULL element 

Siempre cede FALSE .

 SELECT NULL IN (...) SELECT NULL = ANY (...) SELECT NULL::int[] <@ ... 

siempre ceder NULL .

Si no va a consultar valores NULL , puede ignorar esto.