PostgreSQL ILIKE query with SQLAlchemy
Question:
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))
Answers:
I think it should work
Post.query.filter(Post.title.ilike('%some_phrase%'))
For python 3.6 instead of '%' + some_phrase + '%'
you can write
Post.query.filter(Post.title.ilike(f'%{some_phrase}%'))
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
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))
I think it should work
Post.query.filter(Post.title.ilike('%some_phrase%'))
For python 3.6 instead of '%' + some_phrase + '%'
you can write
Post.query.filter(Post.title.ilike(f'%{some_phrase}%'))
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