Метод one класса ScalarResult
Метод one класса ScalarResult возвращает
ровно один скалярный результат из выборки. Если запрос
вернул ноль строк или больше одной строки, метод возбуждает
исключение. Метод не принимает параметров. Обычно
применяется, когда по логике запроса результат гарантированно
должен быть единственным: например, при выборке по первичному
ключу или при агрегатных запросах.
Метод one вызывается у объекта ScalarResult,
который возвращают методы scalars и scalar
объекта Result.
Синтаксис
ScalarResult.one()
Пример
Давайте получим одну строку таблицы articles
по первичному ключу и извлечём ее через метод one:
from sqlalchemy import create_engine, select
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(
title='article',
text='some text',
status='published',
num=1,
))
session.commit()
stmt = select(Article).where(Article.id == 1)
res = session.execute(stmt).scalars().one()
print(res.title)
Результат выполнения кода:
"article"
Пример
Давайте убедимся, что метод one возбуждает
исключение, когда строк в выборке нет:
from sqlalchemy import create_engine, select
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
stmt = select(Article).where(Article.id == 1)
try:
res = session.execute(stmt).scalars().one()
except Exception as e:
print(type(e).__name__)
Результат выполнения кода:
"NoResultFound"
Пример
Давайте убедимся, что метод one возбуждает
исключение, когда строк в выборке больше одной:
from sqlalchemy import create_engine, select
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article', text='some text', status='published', num=1),
Article(title='user', text='other text', status='draft', num=2),
])
session.commit()
stmt = select(Article)
try:
res = session.execute(stmt).scalars().one()
except Exception as e:
print(type(e).__name__)
Результат выполнения кода:
"MultipleResultsFound"
Смотрите также
-
класс
ScalarResult,
который представляет скалярный результат запроса -
метод
all,
который возвращает все строки результата списком -
метод
first,
который возвращает первую строку или None -
метод
one_or_none,
который возвращает одну строку или None без исключения