Python SQL Server: разбиение на страницы

В этом руководстве вы узнаете, как разбивать данные на страницы в SQL Server из программы Python с помощью предложений FETCH и OFFSET.

Этот урок начинается с того места, где закончился урок Выбор данных из таблицы в программе Python.

Пагинация данных

Шаг 1. Определите новую функцию get_customers() в модуле query.py:

def get_customers(limit: int, offset: int = 0) -> list[dict] | None:
    # Connect to the SQL Server
    conn = create_connection()
    if conn is None:
        return None
    sql = f"""SELECT * FROM Customers ORDER BY CustomerID 
            OFFSET %s ROWS FETCH FIRST %s ROWS ONLY"""
    # Execute the query
    with(conn, conn.cursor(as_dict=True) as cursor):
        cursor.execute(sql,(offset, limit))
        return cursor.fetchall()

Как это работает.

Сначала подключитесь к базе данных SQL Server, вызвав функцию create_connection(). Если соединение не удалось, немедленно верните None:

conn = create_connection()
if conn is None:
    return None

Во-вторых, создайте оператор SQL, который извлекает данные из таблицы Customers:

sql = f"SELECT * FROM Customers ORDER BY CustomerID OFFSET %s ROWS FETCH FIRST %s ROWS ONLY"

В запросе заполнители %s представляют собой параметры, которые будут заменены фактическими значениями во время выполнения запроса.

В-третьих, используйте оператор with для правильного управления объектами Connection и Cursor. Это устраняет необходимость вручную закрывать объекты Cursor и Connection и обрабатывать исключения.

with(conn, conn.cursor(as_dict=True) as cursor):

Установка as_dict=True вернет результаты запроса в виде списка словарей, где каждый словарь представляет строку из набора результатов.

В этом случае ключи словарей соответствуют именам столбцов, указанным в операторе SELECT.

В-четвертых, выполните запрос с переменными смещения и предела:

cursor.execute(sql,(offset, limit))

В-пятых, извлеките все строки из набора результатов запроса и верните список объектов словаря:

return cursor.fetchall()

Шаг 2. Измените модуль main.py, чтобы извлечь первых пять клиентов из таблицы Customers:

import logging, sys
from query import get_customers
# config logging to console
logging.basicConfig(
    stream=sys.stdout, 
    encoding='utf-8', 
    format='%(levelname)s:%(message)s',
    level=logging.DEBUG
)
# Get customers
try:
    customers = get_customers(limit=5, offset=0)
    for c in customers:
        print(f'{c["CustomerID"]} - {c["FirstName"]} {c["LastName"]}')
except Exception as e:
    logging.error(f"Error fetching customers: {e}")       

Как это работает.

Сначала импортируйте функцию get_customers из модуля запросов:

from query import get_customers

Во-вторых, вызовите функцию get_customers для первых пяти клиентов:

customers = get_customers(limit=5, offset=0)

В-третьих, отобразите CustomerID, FirstName и LastName найденных клиентов:

for c in customers:
   print(f'{c["CustomerID"]} - {c["FirstName"]} {c["LastName"]}')

Шаг 3. Запустите модуль main.py:

1 - Stephen Johnson
2 - Norma Baxter
3 - Ryan Martin
4 - Eric Fox
5 - Brian Miller

Если вы хотите получить следующих пять клиентов, вы можете установить новое значение смещения следующим образом:

customers = get_customers(limit=5, offset=5)

Он вернет следующих клиентов:

6 - Heather Webb
7 - Nicole Smith
8 - Anna Wilson
9 - Katelyn Harris
10 - Justin Hayes

Загрузите исходный код проекта

Загрузите исходный код проекта

Краткое содержание

  • Выполните оператор SELECT с предложениями OFFSET и FETCH для разбиения данных на страницы.
Мирослав С.

Автор статей, ИБ-специалист