В этом руководстве вы узнаете, как разбивать данные на страницы в 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 для разбиения данных на страницы.