Schritt 3: Proof of Concept für Verbindungen mit SQL mithilfe von pyodbc

In diesem Beispiel für Proof of Concept wird pyodbc eine Verbindung mit einer SQL-Datenbank hergestellt. In diesem Beispiel wird davon ausgegangen, dass Sie die AdventureWorksLT-Beispieldatenbank verwenden.

Hinweis

Dieses Beispiel ist lediglich als Proof of Concept zu verstehen. Es wurde zur Verdeutlichung vereinfacht und entspricht nicht zwangsläufig den von Microsoft empfohlenen Best Practices.

Voraussetzungen

Herstellen der Verbindung und Abfragen von Daten

Stellen Sie mithilfe Ihrer Anmeldeinformationen eine Verbindung mit einer Datenbank her.

  1. Erstellen Sie eine neue Datei mit dem Namen app.py.

  2. Fügen Sie einen Modul-Docstring hinzu.

    """
    Connects to a SQL database using pyodbc
    """
    
  3. Importieren Sie das pyodbc-Paket.

    import pyodbc
    
  4. Erstellen Sie Variablen für Ihre Verbindungsanmeldeinformationen.

    SERVER = '<server-address>'
    DATABASE = '<database-name>'
    USERNAME = '<username>'
    PASSWORD = '<password>'
    
  5. Erstellen Sie eine Verbindungszeichenfolgenvariable mithilfe der Zeichenfolgeninterpolation.

    connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
    
  6. Verwenden von pyodbc.connect Funktion zum Herstellen einer Verbindung mit einer SQL-Datenbank.

    conn = pyodbc.connect(connectionString) 
    

Ausführen einer Abfrage

Verwenden Sie eine SQL-Abfragezeichenfolge, um eine Abfrage auszuführen und die Ergebnisse zu analysieren.

  1. Erstellen Sie eine neue Variable für die SQL-Abfragenzeichenfolge.

    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. Verwenden von cursor.execute zum Abrufen eines Resultsets aus einer Abfrage für die Datenbank.

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

    Hinweis

    Diese Funktion akzeptiert praktisch jede Abfrage und gibt ein Resultset zurück, das mithilfe von cursor.fetchone() durchlaufen werden kann.

  3. Verwenden von cursor.fetchall mit einem foreach Loop, um alle Datensätze aus der Datenbank abzurufen. Drucken Sie dann die Datensätze.

    records = cursor.fetchall()
    for r in records:
        print(f"{r.CustomerID}\t{r.OrderCount}\t{r.CompanyName}")
    
  4. Speichern Sie die Datei app.py.

  5. Öffnen Sie ein Terminal und testen Sie die Anwendung.

    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
    

Einfügen einer Zeile als Transaktion

In diesem Beispiel führen Sie eine INSERT-Anweisung auf sichere Weise aus und übergeben Parameter. Das Übergeben von Parametern als Werte schützt Ihre Anwendung vor Angriffen durch Einschleusung von SQL-Befehlen.

  1. Importieren von randrange aus der Bibliothek random.

    from random import randrange
    
  2. Generieren Sie eine zufällige Produktnummer.

    productNumber = randrange(1000)
    

    Tipp

    Durch die Generierung einer zufälligen Produktnummer wird sichergestellt, dass Sie dieses Beispiel mehrmals ausführen können.

  3. Erstellen Sie eine SQL-Anweisungszeichenfolge.

    SQL_STATEMENT = """
    INSERT SalesLT.Product (
    Name, 
    ProductNumber, 
    StandardCost, 
    ListPrice, 
    SellStartDate
    ) OUTPUT INSERTED.ProductID 
    VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
    """
    
  4. Führen Sie die Anweisung mit cursor.execute aus.

    cursor.execute(
        SQL_STATEMENT,
        f'Example Product {productNumber}', 
        f'EXAMPLE-{productNumber}', 
        100,
        200
    )
    
  5. Fetchen Sie die erste Spalte des einzelnen Ergebnisses mit cursor.fetchval, drucken Sie den eindeutigen Bezeichner des Ergebnisses, und committen Sie den Vorgang dann als Transaktion mit connection.commit.

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

    Tipp

    Optional können Sie connection.rollback verwenden, um die Transaktion zurückzusetzen.

  6. Schließen Sie den Cursor und die Verbindung mithilfe von cursor.close und connection.close.

    cursor.close()
    conn.close()
    
  7. Speichern Sie die app.py-Datei, und testen Sie die Anwendung erneut

    python app.py
    
    Inserted Product ID : 1001
    

Nächste Schritte