Consulta del filtro SQLAlchemy “columna LIKE ANY (matriz)”

Hola expertos en SQLAlchemy, aquí hay uno difícil para ti:

Estoy tratando de escribir una consulta que se resuelve en algo como:

SELECT * FROM MyTable where my_column LIKE ANY (array['a%', 'b%']) 

utilizando SQLAlchemy:

 foo = ['a%', 'b%'] # this works, but is dirty and silly DBSession().query(MyTable).filter("my_column LIKE ANY (array[" + ", ".join(["'" + f + "'" for f in token.tree_filters]) + "])") # something like this should work (according to documentation), but doesn't (throws "AttributeError: Neither 'AnnotatedColumn' object nor 'Comparator' object has an attribute 'any'" DBSession().query(MyTable).filter(MyTable.my_column.any(foo, operator=operators.like) 

¿Alguna solución?

Use or_ () y like() , el siguiente código debe satisfacer bien su necesidad:

 from sqlalchemy import or_ foo = ['a%', 'b%'] DBSession().query(MyTable).filter(or_(*[MyTable.my_column.like(name) for name in foo])) 

Una condición donde se WHERE my_column LIKE 'a%' OR my_column LIKE 'b%' a partir del código anterior.

En cuanto a por qué su any() no funcionó, creo que es porque requiere que my_column sea ​​una lista (consulte aquí ) y, por ejemplo, query(MyTable).filter(MyTable.my_list_column.any(name='abc')) es devolver filas MyTable si algún elemento en la columna my_list_column (una lista) de esa fila se llama con’ abc ‘, por lo que en realidad es muy diferente de su necesidad.

Puedes intentar usar any_ ()

En tu caso se vería algo así:

 from sqlalchemy import any_ foo = ['a%', 'b%'] DBSession().query(MyTable).filter(MyTable.my_column.like(any_(foo)))