2013-12-14 14 views
6

Sto tentando di eseguire una query in Peewee con i risultati che dovrebbero contenere una sottostringa specifica.Corrispondenza di stringhe in Peewee (SQL)

Per esempio, se voglio solo le attività con "Fisica" nel nome:

schedule = Session.select().join(Activity).where(Activity.name % "%Physics%").join(Course).join(StuCouRel).join(Student).where(Student.id == current_user.id) 

L'esempio di cui sopra non dà alcun errore, ma non funziona correttamente.

In python, vorrei solo fare if "Physics" in Activity.name, quindi sto cercando un equivalente che posso usare in una query.

risposta

8

risposta rapida:

basta usare Activity.name.contains('Physics')


A seconda del database back-end che si sta utilizzando ti consigliamo di scegliere il giusto "jolly". Postgresql e MySQL usano "%", ma per Sqlite se si sta eseguendo una query LIKE si vorrà effettivamente usare "*" (sebbene per ILIKE sia "%", confuso).

ho intenzione di indovinare che si sta utilizzando SQLite dal momento che la query di cui sopra non riesce, così, per ricapitolare, con SQLite se si vuole tra maiuscole e minuscole parziale stringa corrispondente: Activity.name % "*Physics*", e per case-insensitive: Activity.name ** "%Physics%".

http://www.sqlite.org/lang_expr.html#like

+0

Grazie. È davvero molto confuso. Stavo usando SQLite per lo sviluppo, ma molto probabilmente passerò a PostgreSQL per la produzione, quindi significa che dovrei cambiarlo? – Ben

+0

Sì, potrei aver bisogno di aggiungere un attributo come '' db.wildcard'' in modo che il tuo codice sia portatile, anche se ovviamente puoi aggiungerlo anche al tuo codice. – coleifer

+1

Puoi usare '' Activity.name.contains ('Physics') '' e dovrebbe fare la cosa giusta! – coleifer

17

Si potrebbe anche usare these metodi di query: .contains(substring), .startswith(prefix), .endswith(suffix).

Ad esempio, la clausola di dove potrebbe essere:

.where(Activity.name.contains("Physics")) 

Credo che questo sia maiuscole e minuscole e si comporta come LIKE '%Physics%'.

+1

Questa è la migliore risposta. – coleifer

+0

Questa è una soluzione più semplice e migliore. Si prega di contrassegnarlo come risposta accettata. – northernman

Problemi correlati