Исключение 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,
которое оборачивает ошибки выполнения запросов