Ответ 1
См. Этот ответ. Короче говоря, вы можете использовать оператор yield_per
.
Мне нужно прочитать данные из всех строк большой таблицы, но я не хочу вытаскивать все данные в память за один раз. Есть ли функция SQLAlchemy, которая будет обрабатывать пейджинг? То есть, вытащить несколько строк в память, а затем извлечь больше, когда это необходимо.
Я понимаю, что вы можете сделать это с limit
и offset
как предлагает эта статья, но я бы не стал обращаться с этим, если мне это не нужно.
См. Этот ответ. Короче говоря, вы можете использовать оператор yield_per
.
Если вы используете колбовую SQLAlchemy см постраничной метод query
. paginate
предлагает несколько методов для упрощения нумерации страниц.
record_query = Record.query.paginate(page, per_page, False)
total = record_query.total
record_items = record_query.items
Первая страница должна быть 1, иначе .total
возвращает исключение, деленное на ноль
Если вы не используете 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()
Если вы создаете 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
Номер предыдущей страницы.
запрос = нет
неограниченный объект запроса, который использовался для создания этого объекта нумерации страниц.
всего = нет
общее количество элементов, соответствующих запросу
Надеюсь, это поможет вам!
Недавно я наткнулся на эту библиотеку, которая реализует разбиение на страницы набора ключей с помощью SQLAlchemy и, возможно, стоит проверить.