Python SQL Server: выбор данных

В этом руководстве вы научитесь запрашивать одну или несколько строк из таблицы SQL Server на Python с помощью API pymssql.

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

Выбор одной строки

Шаг 1. Создайте новый модуль query.py в каталоге проекта.

Шаг 2. Определите функцию, которая находит клиента по идентификатору:

def find_customer_by_id(customer_id: int) -> dict | None:
    # Connect to the SQL Server
    conn = create_connection()
    if conn is None:
        return None
    # Find the customer
    sql = """SELECT 
                CustomerID, FirstName, LastName, Email, PhoneNumber, Address
             FROM 
                CustomerXs 
            WHERE CustomerID = %s"""
    # Execute the query
    with(conn, conn.cursor() as cursor):
        cursor.execute(sql,(customer_id,))
        row = cursor.fetchone()
        return row

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

Сначала импортируем встроенный модуль ведения журнала:

import logging

Во-вторых, импортируйте create_connection из модуля connect :

from connect import create_connection

В-третьих, определите функцию find_customer_by_id, которая возвращает клиента по customer_id:

def find_customer_by_id(customer_id: int) -> tuple | None:

В-четвертых, подключитесь к SQL Server, вызвав функцию create_connection():

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

Если соединение не удалось, немедленно вернуть True.

В-пятых, сформируйте запрос, который находит клиента по идентификатору:

sql = """SELECT 
            CustomerID, FirstName, LastName, Email, PhoneNumber, Address
         FROM 
            Customers 
        WHERE CustomerID = %s"""

В запросе %s — это параметризованный заполнитель, который может предотвратить атаки с использованием SQL-инъекций.

В-шестых, создайте объект Cursor из объекта Connection и управляйте объектами Connection и Cursor в операторе with :

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

В-седьмых, выполните оператор SELECT, вызвав метод execute() объекта Cursor со значением customer_id:

cursor.execute(sql,(customer_id,))

Восьмое, извлеките одну строку из набора результатов запроса с помощью метода fetchone():

row = cursor.fetchone()

Девятое, верните извлеченную строку:

return row

Шаг 3. Измените файл main.py, чтобы использовать функцию find_customer_by_id():

import logging, sys
from query import find_customer_by_id
# config logging to console
logging.basicConfig(
    stream=sys.stdout, 
    encoding='utf-8', 
    format='%(levelname)s:%(message)s',
    level=logging.DEBUG
)
customer = find_customer_by_id(1)
print(customer)

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

Сначала импортируем find_customer_by_id из модуля запроса:

from query import find_customer_by_id

Во-вторых, вызовите функцию find_customer_by_id(), чтобы получить данные о клиенте с идентификатором 1:

customer = find_customer_by_id(1)

В-третьих, выведите данные клиента на терминал:

print(customer)

Выход:

(1, 'Stephen', 'Johnson', ' [email protected] ', '001-301-795-6575x030', '225 Clark Springs, Sarahhaven, AK 81481')

Результатом является кортеж, включающий поля клиентов.

Чтобы изменить результат на словарь, установите аргумент as_dict в значение True при создании курсора:

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

Если вы выполните модуль main.py, вывод будет выглядеть так:

{'CustomerID': 1, 'FirstName': 'Stephen', 'LastName': 'Johnson', 'Email': ' [email protected] ', 'PhoneNumber': '001-301-795-6575x030', 'Address': '225 Clark Springs, Sarahhaven, AK 81481'}

Результатом является словарь, ключами которого являются столбцы в списке выбора запроса.

Выбор нескольких строк

Шаг 1. Добавьте функцию find_customers в модуль query.php, которая находит клиентов по именам с помощью оператора LIKE:

def find_customers(term: str) -> list[dict] | None:
    conn = create_connection()
    if conn is None:
        return None
    # Find the customer
    sql = """SELECT * FROM Customers 
             WHERE FirstName LIKE %s ORDER BY FirstName"""
    name = f'%{term}%'
    with(conn, conn.cursor(as_dict=True) as cursor):
        cursor.execute(sql,(name,))
        return cursor.fetchall()

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

Сначала определите функцию find_customers, которая принимает поисковый запрос и возвращает словарь, содержащий данные о клиентах.

def find_customers(term: str) -> dict | None:

Во-вторых, установите соединение с SQL Server, вызвав функцию create_connection():

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

Если соединение не удалось, немедленно верните None.

В-третьих, создайте оператор SELECT, который использует оператор LIKE для сопоставления имени клиента:

sql = "SELECT * FROM Customers WHERE FirstName LIKE %s ORDER BY FirstName"

В-четвертых, добавьте подстановочные знаки % к поисковому запросу и присвойте результат переменной name:

name = f'%{term}%'

В-пятых, создайте объект Cursor, выполните оператор SELECT, вызовите fetchall() для извлечения всех строк и немедленно верните их:

with(conn, conn.cursor(as_dict=True) as cursor):
    cursor.execute(sql,(name,))
    return cursor.fetchall()

Шаг 2. Измените main.py, чтобы использовать функцию find_customers:

import logging, sys
from query import find_customers
# config logging to console
logging.basicConfig(
    stream=sys.stdout, 
    encoding='utf-8', 
    format='%(levelname)s:%(message)s',
    level=logging.DEBUG
)
# Find the customers whose first name starts with 'Jos'
customers = find_customers('Jos')
for customer in customers:
    print(f'{customer["FirstName"]} {customer["LastName"]}')

Шаг 3. Запустите файл main.py:

python main.py

Выход:

Jose Williams
Joseph Spencer
Joseph Wood
Joseph Lawrence
...

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

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

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

  • Вызовите метод fetchone() для извлечения одной строки из запроса.
  • Вызовите метод fetchall(), чтобы извлечь все строки из запроса.
Мирослав С.

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