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?

Asked By: Gary Oldfaber

||

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()
Answered By: Daniel Kluev

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

Answered By: igsm

Try this code:

output = dbsession.query(<model_class>).filter(
    <model_class>.email.ilike("%" + <email> + "%")
)
Answered By: waruna k

Using PostgreSQL like (see accepted answer above) somehow didn’t work for me although cases matched, but ilike (case insensisitive like) does.

Answered By: koks der drache

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()

Answered By: Toby

In case you want the case insensitive like clause implementation:

session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()
Answered By: Prason Ghimire

In SQLAlchemy 1.4/2.0:

q = db.session.query(User).filter(User.name.like('e%'))

Answered By: collinsmarra

Doing it like this worked for me (Oracle) as native sql

"SELECT * FROM table WHERE tags LIKE '%' || :bar_tags || '%' "
Answered By: cpunz
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.