Поделиться через


Шаг 3. Эксперимент, подразумевающий подключение к SQL с помощью pyodbc

В этом примере показано, как использовать pyodbc концепцию для подключения к базе данных SQL. В этом примере предполагается, что вы используете образец базы данных AdventureWorksLT.

Примечание.

Этот пример следует рассматривать только как подтверждение концепции. Код в этом примере упрощен для удобочитаемости и для него не гарантируется соблюдение рекомендаций корпорации Майкрософт.

Необходимые компоненты

  • Python 3
    • Если у вас еще нет Python, установите диспетчер пакетов Python и диспетчер пакетов Python (PyPI) из python.org.
    • Предпочитаете не использовать собственную среду? Откройте в качестве devcontainer с помощью GitHub Codespaces.
      • Открытие в GitHub Codespaces.
  • pyodbc пакет из PyPI.
  • Установка драйвера Microsoft ODBC 18 для SQL Server
  • База данных SQL и учетные данные.

Подключение и запрос данных

Подключитесь к базе данных с помощью учетных данных.

  1. Создайте файл с именем app.py.

  2. Добавление документации по модулю.

    """
    Connects to a SQL database using pyodbc
    """
    
  3. Импортируйте пакет pyodbc.

    import pyodbc
    
  4. Создайте переменные для учетных данных подключения.

    SERVER = '<server-address>'
    DATABASE = '<database-name>'
    USERNAME = '<username>'
    PASSWORD = '<password>'
    
  5. Создайте переменную строка подключения с помощью интерполяции строк.

    connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
    
  6. Используйте функцию pyodbc.connect для подключения к базе данных SQL.

    conn = pyodbc.connect(connectionString) 
    

Выполнение запроса

Используйте строку SQL-запроса для выполнения запроса и анализа результатов.

  1. Создайте переменную для строки запроса SQL.

    SQL_QUERY = """
    SELECT 
    TOP 5 c.CustomerID, 
    c.CompanyName, 
    COUNT(soh.SalesOrderID) AS OrderCount 
    FROM 
    SalesLT.Customer AS c 
    LEFT OUTER JOIN SalesLT.SalesOrderHeader AS soh ON c.CustomerID = soh.CustomerID 
    GROUP BY 
    c.CustomerID, 
    c.CompanyName 
    ORDER BY 
    OrderCount DESC;
    """
    
  2. Используется cursor.execute для извлечения результирующих наборов из запроса к базе данных.

    cursor = conn.cursor()
    cursor.execute(SQL_QUERY)
    

    Примечание.

    Эта функция фактически принимает любой запрос и возвращает результирующий набор, по которому может быть выполнена итерация с использованием cursor.fetchone().

  3. foreach Используйте cursor.fetchall цикл для получения всех записей из базы данных. Затем распечатайте записи.

    records = cursor.fetchall()
    for r in records:
        print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
    
  4. Сохраните файл app.py .

  5. Откройте терминал и протестируйте приложение.

    python app.py
    
    29485   1       Professional Sales and Service
    29531   1       Remarkable Bike Store
    29546   1       Bulk Discount Store
    29568   1       Coalition Bike Company
    29584   1       Futuristic Bikes
    

Вставка строки в виде транзакции

В этом примере вы безопасно выполняете инструкцию INSERT и передаете параметры. Передача параметров в качестве значений защищает приложение от атак внедрения SQL.

  1. Импорт randrange из библиотеки random .

    from random import randrange
    
  2. Создайте случайный номер продукта.

    productNumber = randrange(1000)
    

    Совет

    Создание случайного номера продукта здесь гарантирует, что этот пример можно запустить несколько раз.

  3. Создайте строку инструкции SQL.

    SQL_STATEMENT = """
    INSERT SalesLT.Product (
    Name, 
    ProductNumber, 
    StandardCost, 
    ListPrice, 
    SellStartDate
    ) OUTPUT INSERTED.ProductID 
    VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
    """
    
  4. Выполните инструкцию с помощью cursor.execute.

    cursor.execute(
        SQL_STATEMENT,
        f'Example Product {productNumber}', 
        f'EXAMPLE-{productNumber}', 
        100,
        200
    )
    
  5. Извлеките первый столбец одного результата, cursor.fetchvalраспечатайте уникальный идентификатор результата, а затем зафиксируйте операцию в виде транзакции с помощью connection.commit.

    resultId = cursor.fetchval()
    print(f"Inserted Product ID : {resultId}")
    conn.commit()
    

    Совет

    При необходимости можно использовать connection.rollback для отката транзакции.

  6. Закройте курсор и подключение с помощью cursor.close и connection.close.

    cursor.close()
    conn.close()
    
  7. Сохраните файл app.py и снова протестируйте приложение

    python app.py
    
    Inserted Product ID : 1001
    

Следующие шаги

Центр разработчиков Python.