35

I'd like to run a query that selects all posts, case insensitive, that have titles that match '%' + [some_phrase] + '%'. That is, select all rows that have titles that contain some phrase, case insensitive. From the research I've done, it looks like I need to use Postgres's ILIKE query for it to match case insensitive. How can I execute a query like this with SQLAlchemy?

class Post(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(250))
    content = db.Column(db.String(5000))
davidism
  • 121,510
  • 29
  • 395
  • 339
sundance
  • 2,905
  • 4
  • 21
  • 31
  • possible duplicate of [Case Insensitive Flask-SQLAlchemy Query](http://stackoverflow.com/questions/16573095/case-insensitive-flask-sqlalchemy-query) – Mark Hildreth Dec 04 '13 at 00:15

3 Answers3

71

I think it should work

Post.query.filter(Post.title.ilike('%some_phrase%'))

http://docs.sqlalchemy.org/en/latest/orm/internals.html?highlight=ilike#sqlalchemy.orm.attributes.QueryableAttribute.ilike

user1454592
  • 1,135
  • 1
  • 11
  • 11
25

For python 3.6 instead of '%' + some_phrase + '%' you can write

Post.query.filter(Post.title.ilike(f'%{some_phrase}%'))
Anatoly E
  • 1,071
  • 11
  • 9
1

There is another workable solution:

from sqlalchemy.sql.operators import ilike_op
Post.query.filter(ilike_op(Post.title, f'%{some_phrase}%'))

This solution helped me to overcame the warning Unresolved attribute reference 'ilike' for class 'property' when I used hybrid_property

akpp
  • 706
  • 10
  • 12