2010-07-24 12 views
42

Sto usando lo schema di tipo MySQLicious descritto here per un semplice sistema di codifica. Ho letto alcune implementazioni alternative dello schema di tagging in 4 diversi thread SO, e questo si adatta meglio alle mie esigenze.Elixir/SQLAlchemy equivalente all'istruzione SQL "LIKE"?

una raccolta di voci avere le modifiche "banana arancio" e "fragole banane limone", e sto cercando di trovare la dichiarazione equivalente Elixir/SQLAlchemy a

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

io non sono stato in grado trovare un modo tale per strutturare un comando Class.query.filter/filter_by() e non può vedere un metodo simile nella documentazione per entrambi i moduli. C'è un modo semplice per fare questo? O dovrei semplicemente usare SQL raw.

Domanda aggiuntiva: Uno svantaggio dello schema MySQLicious è il caso in cui potrei desiderare di cercare "% apple%" ma avere "ananas" restituito. Esiste un modo di alto livello per affrontare questo caso? O dovrei semplicemente includere uno spazio iniziale in ogni query?

n.B: Per chi se ne importa, questa è la mia prima esperienza con i database, quindi potrei non considerare i vantaggi principali dello schema menzionato in altri thread. La mia applicazione serve per registrare una frase o due su un'attività completata, con colonne [TaskID, Tag, Note, StartTime, StopTime, TimeTaken], un po 'come un semplice diario. Principalmente per scopi didattici. Voglio essere in grado di cercare per tag individuali per scoprire approssimativamente quanto tempo dedico a un determinato compito.

+0

Il tag "qui" porta ad una 404 :( – David

risposta

75

Ogni colonna ha il metodo .like, che può essere utilizzato come clausola di filtro.

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

Perfetto! Sapete se c'è un modo migliore per distinguere tra Apple e ananas che aggiungere uno spazio principale? –

+2

Il modo migliore sarebbe semplicemente normalizzare il database e aggiungere 2 tabelle separate per i tag e le relazioni tag-to-task, e quindi usare JOINs anziché LIKE. Altrimenti, sì, sembra che dovrai avere una sorta di separatore attorno a ogni tag nella stringa. Lo spazio principale non è enou gh, poiché c'è anche penna e matita, con% pen%. Se fai qualcosa come "| mela | ananas | penna | matita |" e abbinare "% | pen |%" non dovrebbe scontrarsi. –

+1

Con la normalizzazione, non sono abbastanza sicuro di avere più tag associati a una determinata attività o viceversa utilizzando la mappa dei tag. La soluzione "Toxi" sembra raggruppare la raccolta di tag come un singolo oggetto, piuttosto che archiviarli singolarmente? E il metodo utilizzato in questa ricetta (http://elixir.ematia.de/trac/wiki/Recipes/TagCloud) sembra consentire solo un tag per articolo. Quali risorse sarebbero le migliori per chiarire questo argomento? Ho letto anche questo (http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html), ma non riesco a immaginare come gestire più tag. –

4

Aggiungendo alla risposta di cui sopra, chi cerca una soluzione, si può anche provare 'match' operatore al posto di 'come'. Non voglio essere di parte, ma ha funzionato perfettamente per me in Postgresql.

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

Eredita funzioni di database come CONTIENE e PARTITA. Tuttavia, non è disponibile in SQLite.

Per maggiori informazioni vai Common Filter Operators

+0

Qual è la differenza tra questi due operatori? – buhtz

2

provare questo codice

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