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

Метод one класса Query

Метод one класса Query возвращает ровно одну строку результата запроса. Если база данных вернула ноль строк или больше одной строки, метод возбуждает исключение. Метод не принимает параметров. Возвращаемый результат зависит от того, что именно было указано в запросе: если запрашивалась целая модель, возвращается объект этой модели, если отдельная колонка или их набор, возвращается соответствующее значение или кортеж.

Синтаксис

Query.one()

Пример

Давайте получим единственную статью из таблицы articles с идентификатором 1:

from sqlalchemy import create_engine 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(id=1, title='article 1', text='text 1', status='active', num=10)) session.commit() res = session.query(Article).filter_by(id=1).one() print(res.title)

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

"article 1"

Пример

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

from sqlalchemy import create_engine from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.orm.exc import NoResultFound 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: try: res = session.query(Article).filter_by(id=99).one() print(res) except NoResultFound: print('no result found')

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

"no result found"

Пример

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

from sqlalchemy import create_engine from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session from sqlalchemy.orm.exc import MultipleResultsFound 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(id=1, title='article 1', text='text 1', status='active', num=10), Article(id=2, title='article 2', text='text 2', status='active', num=20), ]) session.commit() try: res = session.query(Article).filter_by(status='active').one() print(res) except MultipleResultsFound: print('multiple results found')

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

"multiple results found"

Пример

Давайте получим не целую модель, а одну колонку через метод with_entities и one:

from sqlalchemy import create_engine 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(id=1, title='article 1', text='text 1', status='active', num=10)) session.commit() res = session.query(Article).with_entities(Article.title).filter_by(id=1).one() print(res)

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

"('article 1',)"

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

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