2011-02-07 18 views

Respuesta

21

Filtrar por db.table.column.like('%needle%'). También hay ilike para una búsqueda insensible a mayúsculas y minúsculas.

Para una interfaz más elegante, puede permitir los comodines "dir" conocidos.

if '*' in needle or '_' in needle: 
    looking_for = needle.replace('_', '__')\ 
         .replace('*', '%')\ 
         .replace('?', '_') 
else: 
    looking_for = '%{0}%'.format(needle) 

result = db.table.filter(db.table.column.ilike(looking_for)) 

Notas:

  • El db.table.filter y db.table.column es para SQLSoup (SQLSoup es útil si la base de datos se hizo por otra aplicación)
  • para SQLAlchemy Core es select(column_list).where(table.c.column.ilike(expr)). Esta interfaz es el camino a seguir cuando desea obtener toda la potencia del SQL sin procesar, sin tener que componer declaraciones a mano mediante interpolación de cadenas (utilícela junto con SQLSoup para introspección, por lo que no necesita declarar tablas)
  • para SQLAlchemy Declarative (el utilizado en el frasco) es Model.query.filter(Model.field.ilike(expr))
+1

Puede decirnos la consulta en matraz de SQLAlchemy – Wally

+1

@Wally matraz de SQLAlchemy es un paquete de conveniencia para conectar SQLAlchemy al matraz. Las consultas no cambian en comparación con SQLAlchemy Declarative. – Laogeodritt

11

Mientras table.c.column.like("%...%") debería funcionar, hay una manera más directa a decir lo que quiere:

table.c.column.contains("needle") 

Esto suele generar la misma consulta SQL pero es mejor leer para los no iniciados. Tenga en cuenta que contiene no parece escapar "_" y "%".

+0

like (% ...%) no es tan directo, no, pero tengo un grupo de tablas (modelos) que convierten field.contains (k) en el campo LIKE '%%' || k || '%%' cada vez: no muestra los resultados correctos. – shermy

40

probar este

Model.query.filter(Model.columnName.contains('sub_string')) 
+0

Gracias por esta respuesta. Has resuelto mi problema. Pero puedes dar detalles sobre esta función. Quiero saber cómo funciona. – Wally

+0

@Wally [sqlalchemy.orm.query.Query.filter] (http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.filter) – danodonovan

+1

@Wally have just revisé este comentario que no fue muy útil, lo siento. Esto es mejor [sqlalchemy.orm.attributes.QueryableAttribute.contains] (http://docs.sqlalchemy.org/en/latest/orm/internals.html?highlight=contains#sqlalchemy.orm.attributes.QueryableAttribute.contains) – danodonovan

Cuestiones relacionadas