Метод contains
Метод contains класса ColumnElement
создает SQL-условие LIKE для поиска
подстроки внутри значения столбца.
Метод принимает подстроку для поиска и
необязательные параметры autoescape
и escape. Если autoescape
равен True, специальные символы
в подстроке экранируются автоматически.
Метод удобен для фильтрации записей по
частичному совпадению текста. Он доступен
как для столбцов ORM-моделей, так и для
произвольных выражений ColumnElement.
Синтаксис
column.contains(other, [autoescape], [escape])
Пример
Давайте создадим модель статьи и найдем
записи, в заголовке которых встречается
подстрока 'article':
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(255))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article one', text='text', status='draft', num=1),
Article(title='article two', text='text', status='published', num=2),
Article(title='user note', text='text', status='draft', num=3),
])
session.commit()
stmt = select(Article).where(Article.title.contains('article'))
res = session.scalars(stmt).all()
for article in res:
print(article.title)
Результат выполнения кода:
"article one"
"article two"
Пример
Метод contains формирует SQL-условие
с оператором LIKE и символами
подстановки %. Посмотрим итоговый
запрос:
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(255))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article one', text='text', status='draft', num=1),
Article(title='user note', text='text', status='draft', num=3),
])
session.commit()
stmt = select(Article).where(Article.status.contains('draft'))
print(stmt)
res = session.scalars(stmt).all()
print(len(res))
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.text, articles.status, articles.num
FROM articles
WHERE (articles.status LIKE '%' || :status_1 || '%')
Результат выполнения кода:
"2"
Пример
Параметр autoescape включает
автоматическое экранирование символов
% и _ в подстроке:
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(255))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='50% off', text='text', status='draft', num=1),
Article(title='500 off', text='text', status='draft', num=2),
])
session.commit()
stmt = select(Article).where(
Article.title.contains('50%', autoescape=True)
)
res = session.scalars(stmt).all()
for article in res:
print(article.title)
Результат выполнения кода:
"50% off"
Смотрите также
-
класс
ColumnElement,
который представляет элемент столбца -
метод
like,
который создает условие LIKE -
метод
startswith,
который ищет совпадение в начале строки -
метод
endswith,
который ищет совпадение в конце строки