Метод 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,
который возвращает все строки результата