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
- Python 3
- Wenn Sie noch nicht über Python verfügen, installieren Sie den Python-Runtime – und Python Package Index (PyPI)-Paket-Manager aus python.org.
- Bevorzugen Sie es, Ihre eigene Umgebung nicht zu verwenden? Öffnen Sie als Devcontainer mit GitHub Codespaces.
pyodbc
Paket von PyPI.- Installieren Sie Microsoft ODBC-Treiber 18 für SQL Server
- Eine SQL-Datenbank und Anmeldeinformationen.
Herstellen der Verbindung und Abfragen von Daten
Stellen Sie mithilfe Ihrer Anmeldeinformationen eine Verbindung mit einer Datenbank her.
Erstellen Sie eine neue Datei mit dem Namen app.py.
Fügen Sie einen Modul-Docstring hinzu.
""" Connects to a SQL database using pyodbc """
Importieren Sie das
pyodbc
-Paket.import pyodbc
Erstellen Sie Variablen für Ihre Verbindungsanmeldeinformationen.
SERVER = '<server-address>' DATABASE = '<database-name>' USERNAME = '<username>' PASSWORD = '<password>'
Erstellen Sie eine Verbindungszeichenfolgenvariable mithilfe der Zeichenfolgeninterpolation.
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
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.
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; """
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.
Verwenden von
cursor.fetchall
mit einemforeach
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}")
Speichern Sie die Datei app.py.
Ö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.
Importieren von
randrange
aus der Bibliothekrandom
.from random import randrange
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.
Erstellen Sie eine SQL-Anweisungszeichenfolge.
SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP) """
Führen Sie die Anweisung mit
cursor.execute
aus.cursor.execute( SQL_STATEMENT, f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 )
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 mitconnection.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.Schließen Sie den Cursor und die Verbindung mithilfe von
cursor.close
undconnection.close
.cursor.close() conn.close()
Speichern Sie die app.py-Datei, und testen Sie die Anwendung erneut
python app.py
Inserted Product ID : 1001