В этом руководстве вы узнаете, как вызвать хранимую процедуру SQL-сервера из программы на Python.
Это руководство начинается с того места, где закончилось руководство по выполнению транзакций базы данных в программе Python.
Создание хранимой процедуры
Шаг 1. Запустите Microsoft SQL Server Management Studio(SSMS) и подключитесь к SQL Server.
Шаг 2. Создайте новую хранимую процедуру, выполнив следующий оператор:
CREATE PROCEDURE GetBooksByPublishedDate
@StartDate DATE,
@EndDate DATE
AS
BEGIN
-- Check for valid date range
IF @StartDate > @EndDate
BEGIN
PRINT 'Error: Start date must be less than or equal to end date.'
RETURN
END
-- Retrieve books within the date range
SELECT BookID, Title, Publisher, ISBN, PublishedDate
FROM Books
WHERE PublishedDate BETWEEN @StartDate AND @EndDate
ORDER BY PublishedDate;
END
Хранимая процедура GetBooksByPublishedDate возвращает список книг между начальной и конечной датами.
Вызов хранимых процедур
Шаг 1. Создайте новый модуль procedure.py со следующим кодом:
from connect import create_connection
def get_books_by_published_date(start_date: str, end_date: str) -> list[dict] | None:
# Connect to the SQL Server
conn = create_connection()
if conn is None:
return None
# Call the stored procedure
with(conn, conn.cursor(as_dict=True) as cursor):
cursor.callproc('GetBooksByPublishedDate',(start_date, end_date))
return cursor.fetchall()
Как это работает.
Сначала импортируйте функцию create_connection из модуля connect :
from connect import create_connection
Во-вторых, определите функцию get_books_by_published_date(), которая возвращает список книг с датой публикации в пределах start_date и end_date:
def get_books_by_published_date(start_date: str, end_date: str) -> list[dict] | None:
В-третьих, подключитесь к SQL Server, вызвав функцию create_connection(), и верните None в случае сбоя подключения:
conn = create_connection()
if conn is None:
return None
В-четвертых, управляйте объектами Connection и Cursor с помощью оператора with:
with(conn, conn.cursor() as cursor):
В-шестых, вызовите хранимую процедуру, вызвав метод callproc() объекта Cursor:
cursor.callproc('GetBooksByPublishedDate',(start_date, end_date))
Обратите внимание, что вам необходимо передать кортеж, включающий параметры хранимой процедуры, второму аргументу метода callproc().
Наконец, верните все строки из результата запроса:
return cursor.fetchall()
Шаг 2. Измените модуль main.py, чтобы использовать функцию get_books_by_published_date():
import logging, sys
from procedure import get_books_by_published_date
# config logging to console
logging.basicConfig(
stream=sys.stdout,
encoding='utf-8',
format='%(levelname)s:%(message)s',
level=logging.DEBUG
)
books = get_books_by_published_date('2022-01-01', '2023-12-31')
for book in books:
print(f'{book["Title"]} - Published on {book["PublishedDate"]}')
Как это работает.
Сначала импортируем функцию get_books_by_published_date из процедуры:
from procedure import get_books_by_published_date
Во-вторых, вызовите функцию get_books_by_published_date, чтобы получить книги, опубликованные в период с 01 января 2022 года по 31 декабря 2023 года:
books = get_books_by_published_date('2022-01-01', '2023-12-31')
В-третьих, отобразите название книги и дату публикации возвращаемых книг:
for book in books:
print(f'{book["Title"]} - Published on {book["PublishedDate"]}')
Шаг 3. Откройте терминал и запустите модуль main.py:
python main.py
Выход:
Mastering SQL: A Comprehensive Guide - Published on 2022-01-15 Database Systems: Theory and Practice - Published on 2022-11-05 SQL Queries for Mere Mortals - Published on 2023-03-21
Загрузите исходный код проекта
Загрузите исходный код проекта
Краткое содержание
- Вызовите метод execute() объекта Cursor для вызова хранимой процедуры SQL Server.

