Метод notlike
Метод notlike класса ColumnElement создает
SQL-выражение отрицания оператора LIKE.
Метод принимает первым параметром строку шаблона,
которой не должна соответствовать колонка.
В шаблоне можно использовать знаки подстановки:
% для любой последовательности символов
и _ для одного произвольного символа.
Вторым необязательным параметром передается
флаг escape для указания символа
экранирования знаков подстановки.
Синтаксис
ColumnElement.notlike(other, escape=None)
Пример
Давайте создадим таблицу articles и выберем
статьи, заголовок которых не начинается со слова
article:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'title': 'article one', 'text': 'text 1', 'status': 'draft', 'num': 1},
{'title': 'article two', 'text': 'text 2', 'status': 'published', 'num': 2},
{'title': 'user guide', 'text': 'text 3', 'status': 'draft', 'num': 3},
{'title': 'sqlite notes', 'text': 'text 4', 'status': 'published', 'num': 4},
])
stmt = select(articles.c.title).where(
articles.c.title.notlike('article%')
)
with engine.connect() as conn:
res = conn.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['user guide', 'sqlite notes']
Пример
Давайте используем знак подстановки _
для поиска заголовков, где четвертый символ
не равен букве t:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'title': 'art one', 'text': 'text 1', 'status': 'draft', 'num': 1},
{'title': 'art two', 'text': 'text 2', 'status': 'published', 'num': 2},
{'title': 'post one', 'text': 'text 3', 'status': 'draft', 'num': 3},
])
stmt = select(articles.c.title).where(
articles.c.title.notlike('art_%')
)
with engine.connect() as conn:
res = conn.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['post one']
Пример
Давайте применим метод notlike
в ORM-запросе к модели Article:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
Теперь выполним запрос, который вернет статьи,
не содержащие слово user в заголовке:
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session
from models import Base, Article
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article one', text='text 1', status='draft', num=1),
Article(title='user guide', text='text 2', status='published', num=2),
Article(title='sqlite notes', text='text 3', status='draft', num=3),
])
session.commit()
with Session(engine) as session:
stmt = select(Article.title).where(
Article.title.notlike('%user%')
)
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article one', 'sqlite notes']
Пример
Давайте посмотрим итоговый SQL-запрос,
который генерирует метод notlike:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
Column('status', String),
Column('num', Integer),
)
stmt = select(articles.c.title).where(
articles.c.title.notlike('article%')
)
print(stmt)
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE articles.title NOT LIKE :title_1
Смотрите также
-
метод
like,
который создает SQL-выражение LIKE -
метод
ilike,
который создает регистронезависимое выражение LIKE -
метод
notilike,
который создает регистронезависимое выражение NOT LIKE -
класс
ColumnElement,
который представляет элемент колонки в SQLAlchemy