РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
41 of 711 menu

Метод 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,
    который возвращает ровно одну строку целиком
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить