Метод scalar_one
Метод scalar_one класса Result возвращает
единственное скалярное значение из результата
запроса. Метод ожидает, что в результате будет
ровно одна строка и один столбец. Если строк
нет или их больше одной, метод выбрасывает
исключение. Параметров метод не принимает.
Метод удобно применять для запросов, которые гарантированно возвращают одно значение, например при подсчете количества записей или получении поля по первичному ключу.
Синтаксис
Result.scalar_one()
Пример
Давайте получим единственное значение из
запроса к таблице articles:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text(
'CREATE TABLE articles '
'(id INTEGER PRIMARY KEY, title TEXT)'
))
conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 1')"
))
conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 2')"
))
res = conn.execute(text(
'SELECT COUNT(*) FROM articles'
))
print(res.scalar_one())
Результат выполнения кода:
2
Пример
Давайте получим значение одного столбца конкретной строки:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text(
'CREATE TABLE articles '
'(id INTEGER PRIMARY KEY, title TEXT)'
))
conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 1')"
))
res = conn.execute(text(
"SELECT title FROM articles WHERE id = 1"
))
print(res.scalar_one())
Результат выполнения кода:
"article 1"
Пример
Давайте посмотрим, что произойдет, если результат пуст:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import NoResultFound
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text(
'CREATE TABLE articles '
'(id INTEGER PRIMARY KEY, title TEXT)'
))
res = conn.execute(text(
'SELECT title FROM articles'
))
try:
print(res.scalar_one())
except NoResultFound as e:
print('NoResultFound:', e)
Результат выполнения кода:
"NoResultFound: No row was found when one was required"
Пример
Давайте посмотрим, что произойдет, если строк больше одной:
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 PRIMARY KEY, title TEXT)'
))
conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 1')"
))
conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 2')"
))
res = conn.execute(text(
'SELECT title FROM articles'
))
try:
print(res.scalar_one())
except MultipleResultsFound as e:
print('MultipleResultsFound:', e)
Результат выполнения кода:
"MultipleResultsFound: Multiple rows were found when exactly one was required"
Смотрите также
-
класс
Result,
который представляет результат запроса -
метод
scalar,
который возвращает первое значение первой строки -
метод
scalar_one_or_none,
который возвращает одно значение или None -
метод
one,
который возвращает ровно одну строку целиком