SQLAlchemy equivalent to SQL "LIKE" statement
Question:
A tags column has values like “apple banana orange” and “strawberry banana lemon”. I want to find the SQLAlchemy equivalent statement to
SELECT * FROM table WHERE tags LIKE "%banana%";
What should I pass to Class.query.filter()
to do this?
Answers:
Each column has like()
method, which can be used in query.filter()
. Given a search string, add a %
character on either side to search as a substring in both directions.
tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()
Adding to the above answer, whoever looks for a solution, you can also try ‘match’ operator instead of ‘like’. Do not want to be biased but it perfectly worked for me in Postgresql.
Note.query.filter(Note.message.match("%somestr%")).all()
It inherits database functions such as CONTAINS and MATCH. However, it is not available in SQLite.
For more info go Common Filter Operators
Try this code:
output = dbsession.query(<model_class>).filter(
<model_class>.email.ilike("%" + <email> + "%")
)
Using PostgreSQL like
(see accepted answer above) somehow didn’t work for me although cases matched, but ilike
(case insensisitive like) does.
If you use native sql, you can refer to my code, otherwise just ignore my answer.
SELECT * FROM table WHERE tags LIKE "%banana%";
from sqlalchemy import text
bar_tags = "banana"
# '%' attention to spaces
query_sql = """SELECT * FROM table WHERE tags LIKE '%' :bar_tags '%'"""
# db is sqlalchemy session object
tags_res_list = db.execute(text(query_sql), {"bar_tags": bar_tags}).fetchall()
In case you want the case insensitive like clause implementation:
session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()
In SQLAlchemy 1.4/2.0:
q = db.session.query(User).filter(User.name.like('e%'))
Doing it like this worked for me (Oracle) as native sql
"SELECT * FROM table WHERE tags LIKE '%' || :bar_tags || '%' "
A tags column has values like “apple banana orange” and “strawberry banana lemon”. I want to find the SQLAlchemy equivalent statement to
SELECT * FROM table WHERE tags LIKE "%banana%";
What should I pass to Class.query.filter()
to do this?
Each column has like()
method, which can be used in query.filter()
. Given a search string, add a %
character on either side to search as a substring in both directions.
tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()
Adding to the above answer, whoever looks for a solution, you can also try ‘match’ operator instead of ‘like’. Do not want to be biased but it perfectly worked for me in Postgresql.
Note.query.filter(Note.message.match("%somestr%")).all()
It inherits database functions such as CONTAINS and MATCH. However, it is not available in SQLite.
For more info go Common Filter Operators
Try this code:
output = dbsession.query(<model_class>).filter(
<model_class>.email.ilike("%" + <email> + "%")
)
Using PostgreSQL like
(see accepted answer above) somehow didn’t work for me although cases matched, but ilike
(case insensisitive like) does.
If you use native sql, you can refer to my code, otherwise just ignore my answer.
SELECT * FROM table WHERE tags LIKE "%banana%";
from sqlalchemy import text
bar_tags = "banana"
# '%' attention to spaces
query_sql = """SELECT * FROM table WHERE tags LIKE '%' :bar_tags '%'"""
# db is sqlalchemy session object
tags_res_list = db.execute(text(query_sql), {"bar_tags": bar_tags}).fetchall()
In case you want the case insensitive like clause implementation:
session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()
In SQLAlchemy 1.4/2.0:
q = db.session.query(User).filter(User.name.like('e%'))
Doing it like this worked for me (Oracle) as native sql
"SELECT * FROM table WHERE tags LIKE '%' || :bar_tags || '%' "