Метод is_not_distinct_from
Метод is_not_distinct_from класса ColumnElement создает SQL-выражение
для сравнения двух значений на «не различность» (IS NOT DISTINCT FROM).
В отличие от обычного оператора равенства ==, этот метод корректно
обрабатывает значения NULL: два NULL считаются не различными,
а NULL и любое другое значение - различными.
Метод принимает один обязательный параметр - значение или выражение
ColumnElement, с которым выполняется сравнение. Возвращает объект
BinaryExpression, пригодный для использования в условиях WHERE.
Синтаксис
column_element.is_not_distinct_from(other)
Пример
Давайте создадим таблицу статей и применим метод is_not_distinct_from
для сравнения значения колонки с числом:
from sqlalchemy import create_engine, Column, Integer, String, select
from sqlalchemy.orm import DeclarativeBase, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
text = Column(String)
status = Column(String)
num = Column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', text='text 1', status='new', num=10),
Article(title='article 2', text='text 2', status='old', num=None),
Article(title='article 3', text='text 3', status='new', num=20),
])
session.commit()
stmt = select(Article.title).where(
Article.num.is_not_distinct_from(10)
)
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 1']
Пример
Теперь сравним колонку с None, чтобы показать обработку
значений NULL:
from sqlalchemy import create_engine, Column, Integer, String, select
from sqlalchemy.orm import DeclarativeBase, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
text = Column(String)
status = Column(String)
num = Column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', text='text 1', status='new', num=10),
Article(title='article 2', text='text 2', status='old', num=None),
Article(title='article 3', text='text 3', status='new', num=20),
])
session.commit()
stmt = select(Article.title).where(
Article.num.is_not_distinct_from(None)
)
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
['article 2']
Пример
Сравнение двух колонок между собой с помощью
is_not_distinct_from:
from sqlalchemy import create_engine, Column, Integer, String, select
from sqlalchemy.orm import DeclarativeBase, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
title = Column(String)
text = Column(String)
status = Column(String)
num = Column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article', text='article', status='new', num=10),
Article(title='article', text='sqlite', status='old', num=20),
])
session.commit()
stmt = select(Article.id).where(
Article.title.is_not_distinct_from(Article.text)
)
res = session.execute(stmt).scalars().all()
print(res)
Результат выполнения кода:
[1]
Смотрите также
-
класс
ColumnElement,
который представляет элемент SQL-выражения -
метод
is_distinct_from,
который выполняет обратное сравнение на различность -
метод
is_,
который сравнивает выражение сNULLилиTrue/False -
метод
is_not,
который выполняет отрицательное сравнение сNULL