Метод scalar класса Query выполняет
запрос и возвращает первое значение первой строки
результата. Если строк нет, метод возвращает
None. Метод удобен, когда запрос возвращает
одно значение: например, при подсчете, получении
максимума или выборке единственного столбца.
Никаких параметров метод не принимает.
Синтаксис
Query.scalar()
Пример
Давайте создадим сессию, модель и получим
скалярное значение из запроса:
from sqlalchemy import create_engine, Integer, 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] = mapped_column(Integer)
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),
Article(title='article 3', text='text 3', status='draft', num=3)
])
session.commit()
res = session.query(Article.title).scalar()
print(res)
Результат выполнения кода:
"article 1"
Пример
Давайте применим метод scalar к агрегатной
функции, чтобы получить количество записей:
<+python+>
from sqlalchemy import create_engine, Integer, String, func
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] = mapped_column(Integer)
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),
Article(title='article 3', text='text 3', status='draft', num=3)
])
session.commit()
res = session.query(func.count(Article.id)).scalar()
print(res)
<-python+>
Результат выполнения кода:
<+python+>
3
<-python+>
Пример
Давайте используем метод scalar с фильтрацией
для получения одного значения из конкретной строки:
<+python+>
from sqlalchemy import create_engine, Integer, 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] = mapped_column(Integer)
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),
Article(title='article 3', text='text 3', status='draft', num=3)
])
session.commit()
res = session.query(Article.title).filter(Article.num == 2).scalar()
print(res)
<-python+>
Результат выполнения кода:
<+python+>
"article 2"
<-python+>
Пример
Давайте проверим, что метод scalar возвращает
None, если запрос не нашел ни одной строки:
<+python+>
from sqlalchemy import create_engine, Integer, 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] = mapped_column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article 1', text='text 1', status='active', num=1))
session.commit()
res = session.query(Article.title).filter(Article.num == 100).scalar()
print(res)
<-python+>
Результат выполнения кода:
<+python+>
None
<-python+>
Смотрите также
-
класс
Query,
который представляет запрос к базе данных
-
метод
one,
который возвращает ровно одну строку результата
-
метод
first,
который возвращает первую строку результата
-
метод
count,
который подсчитывает количество строк в запросе