2013-12-14 25 views
6

Peewee'de, içinde belirli bir alt dizgi olması gereken sonuçlarla sorgulamaya çalışıyorum. ÖrneğinPeewee (SQL) içinde eşleşen dize

, ben adına "Fizik" ile sadece faaliyetlerini istiyorsanız:

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

Yukarıdaki örnek hataları vermez, ancak doğru çalışmıyor.

Python'da sadece if "Physics" in Activity.name yapardım, bu yüzden bir sorguda kullanabileceğim bir eşdeğer arıyorum.

cevap

8

Hızlı cevap:

sadece size hakkı "joker" almak isteyeceksiniz kullandığınız veri tabanı için bağlı Activity.name.contains('Physics')


kullanın. Postgresql ve MySQL "%" kullanır, ancak Sqlite için bir LIKE sorgusu gerçekleştirirseniz aslında "*" yi kullanmak isteyeceksiniz (ILIKE için "%" olmasına rağmen, kafa karıştırıcı).

Yukarıdaki sorgunun başarısız olmasından dolayı SQLite kullandığınızı tahmin edeceğim, bu yüzden büyük küçük harf duyarlı kısmi-string eşleşmesi istiyorsanız SQLite ile yeniden yazmak için: Activity.name % "*Physics*" ve büyük/küçük harf duyarsız: Activity.name ** "%Physics%". .contains(substring), .startswith(prefix), .endswith(suffix):

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

+0

Teşekkürler. Gerçekten çok kafa karıştırıcı. Geliştirme için SQLite kullanıyordum, ama büyük olasılıkla PostgreSQL'e üretim için geçeceğim, bu da onu değiştirmek zorunda olduğum anlamına geliyor? – Ben

+0

Evet, '' db.wildcard'' gibi bir öznitelik eklemem gerekebilir, bu nedenle kodunuz taşınabilir olacaktır, ancak kendi kodunuza da ekleyebilirsiniz. – coleifer

+1

'' Activity.name.contains ('Physics') '' seçeneğini kullanabilir ve doğru olanı yapmalıdır! – coleifer

17

Ayrıca these sorgu yöntemlerini kullanabilirsiniz.

Örneğin, nerede fıkra olabilir:

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

Bu LIKE '%Physics%' aynı harf duyarsız ve davranır inanıyoruz.

+1

Bu en iyi cevaptır. – coleifer

+0

Bu daha basit ve daha iyi bir çözümdür. Lütfen Kabul edilen cevap olarak işaretleyin. – northernman