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

Исключение MultipleResultsFound

Исключение MultipleResultsFound наследуется от InvalidRequestError и сигнализирует о том, что запрос вернул больше одной строки там, где ожидалась ровно одна. Обычно оно возникает при вызове методов one или one_or_none, а также в связке с scalar_one и scalar_one_or_none. Никаких параметров исключение не принимает, а его текст формируется автоматически в момент обнаружения лишних строк.

Синтаксис

from sqlalchemy.exc import MultipleResultsFound raise MultipleResultsFound()

Пример

Давайте воспроизведем ситуацию, в которой запрос возвращает две строки, а метод one ожидает одну:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import MultipleResultsFound class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article'), Article(title='article'), ]) session.commit() try: article = session.query(Article).filter_by(title='article').one() print(article) except MultipleResultsFound as e: print('MultipleResultsFound:', e)

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

"MultipleResultsFound: Multiple rows were found when exactly one was required"

Пример

Давайте посмотрим, как то же самое поведение проявляется через метод scalar_one в стиле SQLAlchemy 2.0:

from sqlalchemy import create_engine, String, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.exc import MultipleResultsFound class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(50)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article'), Article(title='article'), ]) session.commit() stmt = select(Article).where(Article.title == 'article') try: article = session.scalars(stmt).one() print(article) except MultipleResultsFound as e: print('MultipleResultsFound:', e)

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

"MultipleResultsFound: Multiple rows were found when exactly one was required"

Пример

Давайте заменим one на first, чтобы избежать исключения и просто взять первую строку:

from sqlalchemy import create_engine, String 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(50)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article'), Article(title='article'), ]) session.commit() article = session.query(Article).filter_by(title='article').first() print(article.title if article else None)

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

"article"

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

  • исключение NoResultFound,
    которое возникает, когда строк не найдено вовсе
  • исключение InvalidRequestError,
    от которого наследуется MultipleResultsFound
  • исключение SQLAlchemyError,
    базовый класс всех исключений SQLAlchemy
  • исключение StatementError,
    которое оборачивает ошибки выполнения запросов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить