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

Метод fetchmany класса Result

Метод fetchmany класса Result возвращает список строк результата запроса порциями заданного размера. Первым параметром метод принимает целое число size - сколько строк нужно вернуть за один вызов. Если параметр не указан, используется значение атрибута cursor.arraysize, которое по умолчанию равно единице. Когда строки заканчиваются, метод возвращает пустой список. Метод удобен для обработки больших выборок без загрузки всех строк в память сразу.

Синтаксис

Result.fetchmany(size=None)

Пример

Давайте создадим таблицу, наполним ее строками и выберем первые две строки методом fetchmany:

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 (:id, :title)'), [ {'id': 1, 'title': 'article 1'}, {'id': 2, 'title': 'article 2'}, {'id': 3, 'title': 'article 3'}, {'id': 4, 'title': 'article 4'}, ], ) conn.commit() res = conn.execute(text('SELECT id, title FROM articles')) print(res.fetchmany(2))

Результат выполнения кода:

[(1, 'article 1'), (2, 'article 2')]

Пример

Давайте вызовем fetchmany несколько раз подряд, чтобы получить всю выборку по частям:

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 (:id, :title)'), [ {'id': 1, 'title': 'article 1'}, {'id': 2, 'title': 'article 2'}, {'id': 3, 'title': 'article 3'}, ], ) conn.commit() res = conn.execute(text('SELECT id, title FROM articles')) print(res.fetchmany(2)) print(res.fetchmany(2))

Результат выполнения кода:

[(1, 'article 1'), (2, 'article 2')] [(3, 'article 3')]

Пример

Давайте убедимся, что при исчерпании строк метод возвращает пустой список:

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 (:id, :title)'), [ {'id': 1, 'title': 'article 1'}, {'id': 2, 'title': 'article 2'}, ], ) conn.commit() res = conn.execute(text('SELECT id, title FROM articles')) print(res.fetchmany(2)) print(res.fetchmany(2))

Результат выполнения кода:

[(1, 'article 1'), (2, 'article 2')] []

Пример

Давайте поработаем с ORM-моделью и получим строки через fetchmany в цикле:

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]
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'), Article(title='article 2'), Article(title='article 3'), Article(title='article 4'), ] ) session.commit() res = session.execute(select(Article)) while True: batch = res.fetchmany(2) if not batch: break print(batch)

Результат выполнения кода:

[(<Article object at ...>,), (<Article object at ...>,)] [(<Article object at ...>,), (<Article object at ...>,)]

Смотрите также

  • класс Result,
    который представляет результат запроса
  • метод fetchone,
    который возвращает одну строку результата
  • метод fetchall,
    который возвращает все строки результата
  • метод yield_per,
    который лениво отдает строки порциями
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить