Метод first класса Query
Метод first класса Query возвращает
первый объект из результата запроса. Если
запрос не вернул ни одной строки, метод
возвращает None. Метод не принимает
параметров и автоматически добавляет к
SQL-запросу ограничение LIMIT 1.
Метод удобен, когда нужно получить одну
конкретную запись, но при этом не важно,
есть ли в таблице другие подходящие строки.
В отличие от метода one, метод first
не выбрасывает исключение, если записей
больше одной.
Синтаксис
Query.first()
Пример
Давайте создадим модель статьи и получим первую запись из таблицы:
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))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3')
])
session.commit()
res = session.query(Article).first()
print(res.id, res.title)
Результат выполнения кода:
"1 article 1"
Пример
Давайте применим сортировку, чтобы метод
first вернул не первую по порядку
запись, а первую после сортировки:
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))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1'),
Article(title='article 2'),
Article(title='article 3')
])
session.commit()
res = session.query(Article).order_by(Article.id.desc()).first()
print(res.id, res.title)
Результат выполнения кода:
"3 article 3"
Пример
Давайте проверим, что метод возвращает
None, если подходящих записей нет:
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))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article 1'))
session.commit()
res = session.query(Article).filter_by(title='article 2').first()
print(res)
Результат выполнения кода:
"None"
Смотрите также
-
класс
Query,
который представляет запрос к базе данных -
метод
one,
который возвращает ровно одну запись -
метод
one_or_none,
который возвращает одну запись или None -
метод
all,
который возвращает список всех записей