SQLAlchemy и пейджинг

Мне нужно прочитать данные из всех строк большой таблицы, но я не хочу вытаскивать все данные в память за один раз. Есть ли функция SQLAlchemy, которая будет обрабатывать пейджинг? То есть, вытащить несколько строк в память, а затем извлечь больше, когда это необходимо.

Я понимаю, что вы можете сделать это с limit и offset как предлагает эта статья, но я бы не стал обращаться с этим, если мне это не нужно.

Ответ 2

Если вы используете колбовую SQLAlchemy см постраничной метод query. paginate предлагает несколько методов для упрощения нумерации страниц.

record_query = Record.query.paginate(page, per_page, False)
total = record_query.total
record_items = record_query.items

Первая страница должна быть 1, иначе .total возвращает исключение, деленное на ноль

Ответ 3

Если вы не используете Flask, вы можете использовать функцию SqlAlchemy "slice" или комбинацию "limit" и "offset", как указано здесь. Например:

some_query = Query([TableBlaa])
query = some_query.limit(number_of_rows_per_page).offset(page_number*number_of_rows_per_page)
#  -- OR --
query = some_query.slice(page_number*number_of_rows_per_page, (page_number*number_of_rows_per_page)+number_of_rows_per_page)
current_pages_rows = session.execute(query).fetchall()

Ответ 4

Если вы создаете API для использования с ReactJs, vueJs или другой оболочкой frontEnd, вы можете обрабатывать так:

Обратите внимание:

page: текущая страница, которая вам нужна

error_out: не отображать ошибки

max_per_page или per_page: предел

Документация: SqlAchemy pagination

    record_query = Record.query.paginate(page=*Number*, error_out=False, max_per_page=15)

    result = dict(datas=record_query.items, 
                   total=record_query.total, 
                   current_page=record_query.page,
                   per_page=record_query.per_page)

На record_query вы можете использовать:

Следующий (error_out = False)

Возвращает объект пагинации для следующей страницы.

next_num

Номер следующей страницы

страница = нет

номер текущей страницы (1 проиндексирован)

страницы

Общее количество страниц

per_page = Нет

количество элементов, отображаемых на странице.

предыдущая (error_out = False)

Возвращает объект пагинации для предыдущей страницы.

prev_num

Номер предыдущей страницы.

запрос = нет

неограниченный объект запроса, который использовался для создания этого объекта нумерации страниц.

всего = нет

общее количество элементов, соответствующих запросу

Надеюсь, это поможет вам!

Ответ 5

Недавно я наткнулся на эту библиотеку, которая реализует разбиение на страницы набора ключей с помощью SQLAlchemy и, возможно, стоит проверить.

https://github.com/djrobstep/sqlakeyset