Метод one класса Session
Метод one класса Session возвращает
ровно одну строку из результата запроса.
Метод вызывается у объекта результата, который
возвращает execute. Если запрос вернул
ноль строк или больше одной строки, метод
вызывает исключение. Это делает one
удобным, когда нужно гарантировать
единственность результата.
Синтаксис
res = session.execute(statement)
row = res.one()
Пример
Давайте создадим сессию и таблицу articles,
а затем получим единственную строку методом
one:
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))
text: Mapped[str] = mapped_column(String(200))
status: Mapped[str] = mapped_column(String(20))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article 1',
text='text 1',
status='active',
num=1,
)
session.add(article)
session.commit()
res = session.execute(
Article.__table__.select()
)
row = res.one()
print(row)
Результат выполнения кода:
(1, 'article 1', 'text 1', 'active', 1)
Пример
Давайте получим объект модели методом
one через запрос select:
from sqlalchemy import create_engine, String, 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] = mapped_column(String(50))
text: Mapped[str] = mapped_column(String(200))
status: Mapped[str] = mapped_column(String(20))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article 1',
text='text 1',
status='active',
num=1,
)
session.add(article)
session.commit()
res = session.execute(
select(Article).where(Article.title == 'article 1')
)
obj = res.one()
print(obj)
Результат выполнения кода:
(<Article id=1, title='article 1', text='text 1', status='active', num=1>,)
Обратите внимание, что one возвращает
именованный кортеж. Чтобы получить сам объект,
используйте scalar_one.
Пример
Давайте убедимся, что при нескольких строках
метод one вызывает исключение:
Результат выполнения кода:
"MultipleResultsFound"
Смотрите также
-
класс
Session,
который представляет сессию работы с базой -
метод
one_or_none,
который возвращает одну строку или None -
метод
scalar_one,
который возвращает одно скалярное значение -
метод
first,
который возвращает первую строку результата