Etapa 3: Prova de conceito da conexão ao SQL usando pyodbc

Esta prova de conceito de exemplo usa pyodbc para se conectar a um banco de dados SQL. Este exemplo pressupõe que você esteja usando o banco de dados de exemplo AdventureWorksLT.

Observação

Este exemplo só deve ser considerado como uma prova de conceito. O código de exemplo está simplificado para fins de clareza e não necessariamente representa as melhores práticas recomendadas pela Microsoft.

Pré-requisitos

Conectar e pesquisar dados

Conecte-se a um banco de dados usando suas credenciais.

  1. Crie um novo arquivo chamado app.py.

  2. Adicione um módulo docstring.

    """
    Connects to a SQL database using pyodbc
    """
    
  3. Importar o pacote pyodbc.

    import pyodbc
    
  4. Crie variáveis para suas credenciais de conexão.

    SERVER = '<server-address>'
    DATABASE = '<database-name>'
    USERNAME = '<username>'
    PASSWORD = '<password>'
    
  5. Crie uma variável de cadeia de conexão usando interpolação de cadeia de caracteres.

    connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
    
  6. Use a função pyodbc.connect para conectar a um banco de dados SQL.

    conn = pyodbc.connect(connectionString) 
    

Executar uma consulta

Use uma cadeia de caracteres de consulta SQL para executar uma consulta e analisar os resultados.

  1. Crie uma variável para a cadeia de caracteres de consulta 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. Use cursor.execute para recuperar um conjunto de resultados de uma consulta em relação ao banco de dados.

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

    Observação

    Essencialmente, essa função aceita qualquer consulta e retorna um conjunto de resultados que pode ser iterado com o uso de cursor.fetchone().

  3. Use cursor.fetchall com um loop foreach para obter todos os registros do banco de dados. Em seguida, imprima os registros.

    records = cursor.fetchall()
    for r in records:
        print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
    
  4. Salve o arquivo app.py.

  5. Abra um terminal e teste o aplicativo.

    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
    

Inserir uma linha como uma transação

Neste exemplo, você verá como executar uma instrução INSERT com segurança e passar parâmetros. Passar parâmetros como valores protege seu aplicativo contra ataques de injeção de SQL.

  1. Importe randrange da biblioteca random.

    from random import randrange
    
  2. Gere um número de produto aleatório.

    productNumber = randrange(1000)
    

    Dica

    Gerar um número de produto aleatório aqui garante que você possa executar essa amostra várias vezes.

  3. Crie uma cadeia de caracteres de instrução SQL.

    SQL_STATEMENT = """
    INSERT SalesLT.Product (
    Name, 
    ProductNumber, 
    StandardCost, 
    ListPrice, 
    SellStartDate
    ) OUTPUT INSERTED.ProductID 
    VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
    """
    
  4. Execute a instrução usando cursor.execute.

    cursor.execute(
        SQL_STATEMENT,
        f'Example Product {productNumber}', 
        f'EXAMPLE-{productNumber}', 
        100,
        200
    )
    
  5. Busque a primeira coluna do resultado único usando cursor.fetchval, imprima o identificador exclusivo do resultado e confirme a operação como uma transação usando connection.commit.

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

    Dica

    Opcionalmente, você pode usar connection.rollback para reverter a transação.

  6. Feche o cursor e a conexão usando cursor.close e connection.close.

    cursor.close()
    conn.close()
    
  7. Salve o arquivo app.py e teste o aplicativo novamente

    python app.py
    
    Inserted Product ID : 1001
    

Próximas etapas