Метод scalars
Метод scalars класса Result
возвращает объект ScalarResult, который
позволяет перебирать первый столбец каждой
строки результата. Метод не принимает
параметров. Он удобен, когда запрос возвращает
одну колонку, либо когда нужна только первая
колонка из каждой строки.
Синтаксис
res.scalars()
Пример
Давайте выполним запрос, возвращающий одну
колонку, и переберем результаты через
scalars:
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 1')"))
conn.execute(text("INSERT INTO articles (id, title) VALUES (2, 'article 2')"))
conn.commit()
res = conn.execute(text('SELECT title FROM articles ORDER BY id'))
for title in res.scalars():
print(title)
Результат выполнения кода:
"article 1"
"article 2"
Пример
Если запрос возвращает несколько колонок,
scalars вернет только значения первой
колонки:
<+python+>
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 1')"))
conn.execute(text("INSERT INTO articles (id, title) VALUES (2, 'article 2')"))
conn.commit()
res = conn.execute(text('SELECT id, title FROM articles ORDER BY id'))
for value in res.scalars():
print(value)
<-python+>
Результат выполнения кода:
1
2
Пример
Давайте применим scalars вместе с 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 Base, Article
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='new', num=1),
Article(title='article 2', text='text 2', status='new', num=2),
])
session.commit()
res = session.execute(select(Article).order_by(Article.id))
for article in res.scalars():
print(article.title)
Результат выполнения кода:
"article 1"
"article 2"
Смотрите также
-
класс
Result,
который представляет результат выполнения запроса -
метод
scalar,
который возвращает одно скалярное значение -
метод
scalar_one,
который возвращает ровно одно скалярное значение -
метод
scalar_one_or_none,
который возвращает одно значение или None