Étape 3 : Preuve de concept pour se connecter à SQL à l’aide de pymssql
Cet exemple de preuve de concept utilise pymssql
pour se connecter à une base de données SQL. Dans cet exemple, on suppose que vous utilisez l’exemple de base de données AdventureWorksLT.
Note
Cet exemple doit être considéré uniquement comme une preuve de concept. L’exemple de code est simplifié par souci de clarté et ne représente pas nécessairement les meilleures pratiques recommandées par Microsoft.
Conditions préalables
- Python 3
- Si vous n’avez pas encore Python, installez le runtime Python et le gestionnaire de package Python Package Index (PyPI) à partir de python.org.
- Si vous préférez ne pas utiliser votre propre environnement, ouvrez en tant que devcontainer à l’aide de GitHub Codespaces.
- Package
pymssql
à partir de PyPI. - Une base de données SQL et les informations d’identification.
Connecter et interroger des données
Connectez-vous à une base de données à l’aide de vos informations d’identification.
Créez un fichier nommé app.py.
Ajoutez une description docstring du module.
""" Connects to a SQL database using pymssql """
Importez le package
pymssql
.import pymssql
Utilisez la fonction
pymssql.connect
pour vous connecter à une base de données SQL.conn = pymssql.connect( server='<server-address>', user='<username>', password='<password>', database='<database-name>', as_dict=True )
Exécuter une requête
Utilisez une chaîne de requête SQL pour exécuter une requête et analyser les résultats.
Créez une variable pour la chaîne de requête 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; """
Utilisez
cursor.execute
pour récupérer un jeu de résultats à partir d’une requête sur la base de données.cursor = conn.cursor() cursor.execute(SQL_QUERY)
Note
Cette fonction accepte n’importe quelle requête et renvoie un jeu de résultats qui peut être itéré à l’aide de cursor.fetchone().
Utilisez
cursor.fetchall
avec une boucleforeach
pour obtenir tous les enregistrements de la base de données. Ensuite, imprimez les enregistrements.records = cursor.fetchall() for r in records: print(f"{r['CustomerID']}\t{r['OrderCount']}\t{r['CompanyName']}")
Enregistrez le fichier app.py.
Ouvrez un terminal et testez l’application.
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
Insérer une ligne en tant que transaction
Dans cet exemple, vous allez exécuter une instruction INSERT
en toute sécurité et passer des paramètres. Le passage de paramètres en tant que valeurs protège votre application contre les attaques par injection de code SQL.
Importez
randrange
à partir de la bibliothèquerandom
.from random import randrange
Générez un numéro de produit aléatoire.
productNumber = randrange(1000)
Astuce
Générer un numéro de produit aléatoire ici vous garantit de pouvoir exécuter cet exemple plusieurs fois.
Créez une chaîne d’instruction SQL.
SQL_STATEMENT = """ INSERT SalesLT.Product ( Name, ProductNumber, StandardCost, ListPrice, SellStartDate ) OUTPUT INSERTED.ProductID VALUES (%s, %s, %s, %s, CURRENT_TIMESTAMP) """
Exécutez l’instruction à l’aide de
cursor.execute
.cursor.execute( SQL_STATEMENT, ( f'Example Product {productNumber}', f'EXAMPLE-{productNumber}', 100, 200 ) )
Récupérez le résultat unique à l’aide de
cursor.fetchone
, imprimez l’identificateur unique du résultat, puis validez l’opération en tant que transaction à l’aide deconnection.commit
.result = cursor.fetchone() print(f"Inserted Product ID : {result['ProductID']}") conn.commit()
Astuce
Éventuellement, vous pouvez utiliser
connection.rollback
pour restaurer la transaction.Fermez le curseur et la connexion à l’aide de
cursor.close
etconnection.close
.cursor.close() conn.close()
Enregistrez le fichier app.py et testez à nouveau l’application
python app.py
Inserted Product ID : 1001