РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
62 of 711 menu

Метод one_or_none

Метод one_or_none класса ScalarResult возвращает ровно один скалярный объект из результата запроса. Если в результате нет ни одной строки, метод возвращает None. Если строк больше одной, метод возбуждает исключение MultipleResultsFound. Метод не принимает параметров.

Синтаксис

ScalarResult.one_or_none()

Пример

Давайте получим единственную статью по идентификатору. Сначала объявим модель:

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]

Теперь выполним запрос и вызовем метод one_or_none:

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(Article( id=1, title='article 1', text='text 1', status='published', num=10 )) session.commit() stmt = select(Article).where(Article.id == 1) res = session.scalars(stmt).one_or_none() print(res.title)

Результат выполнения кода:

"article 1"

Пример

Давайте убедимся, что при отсутствии строк метод возвращает None:

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: stmt = select(Article).where(Article.id == 999) res = session.scalars(stmt).one_or_none() print(res)

Результат выполнения кода:

None

Пример

Давайте посмотрим, что произойдет, если запрос вернет несколько строк:

<+python+> from sqlalchemy import create_engine, select from sqlalchemy.orm import Session from sqlalchemy.exc import MultipleResultsFound from models import Base, Article engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(id=1, title='article 1', text='text 1', status='published', num=10), Article(id=2, title='article 2', text='text 2', status='draft', num=20) ]) session.commit() stmt = select(Article).where(Article.status == 'published') try: res = session.scalars(stmt).one_or_none() except MultipleResultsFound: print('MultipleResultsFound') <-python+>

Результат выполнения кода:

"MultipleResultsFound"

Смотрите также

  • класс ScalarResult,
    который представляет скалярный результат запроса
  • метод one,
    который возвращает ровно один объект
  • метод first,
    который возвращает первую строку результата
  • метод all,
    который возвращает все строки результата
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить