Метод 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 ...>,)]