Метод one класса Result
Метод one класса Result возвращает
ровно одну строку результата запроса. Если
запрос вернул ноль строк или больше одной строки,
метод выбрасывает исключение. Это делает его
удобным для запросов, которые гарантированно
должны вернуть единственную запись, например
при выборке по первичному ключу. Параметров
метод не принимает.
Синтаксис
Result.one()
Пример
Давайте создадим таблицу articles и
получим единственную строку методом one:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT)'))
conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'article')"))
res = conn.execute(text('SELECT id, title FROM articles WHERE id = 1'))
row = res.one()
print(row)
Результат выполнения кода:
(1, 'article')
Пример
Метод one можно использовать и с ORM-запросами
через сессию. Давайте получим объект модели:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
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]
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session
from models import Article
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
session.add(Article(id=1, title='article', text='sqlalchemy', status='new', num=10))
session.commit()
res = session.execute(select(Article).where(Article.id == 1))
article = res.one()[0]
print(article.title)
Результат выполнения кода:
"article"
Пример
Если строк больше одной, метод one выбрасывает
исключение MultipleResultsFound:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import MultipleResultsFound
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT)'))
conn.execute(text("INSERT INTO articles (id, title) VALUES (1, 'article')"))
conn.execute(text("INSERT INTO articles (id, title) VALUES (2, 'user')"))
res = conn.execute(text('SELECT id, title FROM articles'))
try:
row = res.one()
except MultipleResultsFound:
print('multiple rows found')
Результат выполнения кода:
"multiple rows found"
Смотрите также
-
класс
Result,
который представляет результат запроса -
метод
one_or_none,
который возвращает одну строку или None -
метод
first,
который возвращает первую строку результата -
метод
all,
который возвращает все строки списком