Python SQL Server: вызов хранимых процедур

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

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