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