SQLAlchemy и пейджинг - PullRequest
       5

SQLAlchemy и пейджинг

17 голосов
/ 29 марта 2012

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

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

Ответы [ 5 ]

20 голосов
/ 12 ноября 2013

Если вы используете Flask-SqlAlchemy, см. paginate метод query. paginate предлагает несколько методов для упрощения нумерации страниц.

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

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

14 голосов
/ 29 марта 2012

См. этот ответ .Короче говоря, вы можете использовать оператор yield_per.

3 голосов
/ 18 февраля 2019

Если вы создаете 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

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

query = None

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

всего = Нет

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

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

3 голосов
/ 21 июня 2017

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

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()
0 голосов
/ 14 марта 2019

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

https://github.com/djrobstep/sqlakeyset

...