2010-07-24 12 views
42

Estoy utilizando el esquema de tipo MySQLicious descrito here para un sistema de etiquetado simple. He leído algunas implementaciones alternativas del esquema de etiquetado en 4 hilos SO diferentes, y esto se adapta mejor a mis necesidades.Elixir/SQLAlchemy equivalente a la declaración SQL "LIKE"?

Una colección de entradas de tener las etiquetas "naranja plátano manzana" y "limón plátano de fresa", y yo estoy tratando de encontrar la declaración equivalente Elixir/SQLAlchemy a

SELECT * FROM table WHERE tags LIKE "%banana%"; 

No he podido para encontrar cualquier forma de estructurar un comando Class.query.filter/filter_by(), y no puede ver un método similar en la documentación de ninguno de los módulos. ¿Hay una manera simple de hacer esto? O debería simplemente usar SQL sin formato.

Pregunta adicional: Una desventaja del esquema MySQLicious es el caso en el que puedo desear buscar "% apple%" pero me devuelven "piña". ¿Hay una forma de alto nivel para lidiar con este caso de prueba? ¿O debería simplemente incluir un espacio líder en cada consulta?

n.B: Para los que les importa, esta es mi primera experiencia con las bases de datos, por lo que puedo estar pasando por alto las ventajas principales del esquema mencionado en otros hilos. Mi aplicación es para registrar una oración o dos sobre una tarea completada, con columnas [TaskID, Tags, Notes, StartTime, StopTime, TimeTaken], un poco como un diario simple. En su mayoría con fines tutoriales. Deseo poder buscar por etiquetas individuales para averiguar aproximadamente cuánto tiempo gasto en una tarea determinada.

+0

El "aquí" etiqueta lleva a un 404 :( – David

Respuesta

75

Cada columna tiene el método .like, que se puede utilizar como cláusula de filtro.

>>> Note.query.filter(Note.message.like("%somestr%")).all() 
[] 
+1

perfecto! ¿Sabe usted si hay una mejor manera de distinguir entre la manzana y ¿piña que agregar un espacio líder? –

+2

La mejor manera sería simplemente normalizar su base de datos y agregar 2 tablas separadas para etiquetas y relaciones etiqueta a tarea, y luego usar UNIONES en lugar de COMO. De lo contrario, sí, parece que tendrá que tener algún tipo de separador alrededor de cada etiqueta en la cadena. El espacio principal no es enou gh, ya que también hay lápiz y bolígrafo, con% pen%. Si haces algo como "| apple | pineapple | pen | pencil |" y coincide con "% | pen |%", no debería colisionar. –

+1

Con la normalización, no estoy muy seguro de cómo tendré más de una etiqueta asociada a una tarea determinada, o viceversa, utilizando el mapa de etiquetas. La solución "Toxi" parece agrupar la colección de etiquetas como un solo elemento, en lugar de almacenarlas individualmente. Y el método utilizado en esta receta (http://elixir.ematia.de/trac/wiki/Recipes/TagCloud) parece permitir solo una etiqueta por artículo. ¿Qué recursos serían los mejores para dilucidar este tema? También he leído esto (http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html), pero no puedo imaginar cómo administrar varias etiquetas. –

4

Agregando a la respuesta anterior, quien busque una solución, también puede probar el operador 'combinar' en lugar de 'me gusta'. No quiero ser parcial, pero funcionó perfectamente para mí en Postgresql.

Note.query.filter(Note.message.match("%somestr%")).all() 

Se hereda funciones de bases de datos tales como CONTIENE y PARTIDO. Sin embargo, no está disponible en SQLite.

Para más información ir Common Filter Operators

+0

¿Cuál es la diferencia entre estos dos operadores? – buhtz

2

tratar este código

output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + <email> + '%')) 
Cuestiones relacionadas