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

Метод 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 вызывает исключение:

<+python+> 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: session.add_all([ Article(title='article 1', text='text 1', status='active', num=1), Article(title='article 2', text='text 2', status='active', num=2), ]) session.commit() res = session.execute(Article.__table__.select()) try: row = res.one() except Exception as e: print(type(e).__name__) <-python+>

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

"MultipleResultsFound"

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

  • класс Session,
    который представляет сессию работы с базой
  • метод one_or_none,
    который возвращает одну строку или None
  • метод scalar_one,
    который возвращает одно скалярное значение
  • метод first,
    который возвращает первую строку результата
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить