HOWTO · Python
Se connecter à un serveur Microsoft SQL à l'aide de Python et Pyodbc
Apprenez à vous connecter à un serveur Microsoft SQL en utilisant Python et pyodbc
Sur cette page
Utilisez pyodbc pour connecter une application Python à Microsoft SQL Server via ODBC. Installez le paquet Python ainsi qu’un pilote ODBC compatible avec SQL Server, puis transmettez à pyodbc.connect() les paramètres du serveur, de la base de données, du pilote et de l’authentification. Ce guide utilise SQL directement ; un ORM constitue une autre option si vous souhaitez représenter les tables de la base de données sous forme d’objets Python.
Installer pyodbc et le pilote ODBC de SQL Server
Installez pyodbc dans le même environnement Python que celui utilisé pour exécuter votre application, par exemple avec python -m pip install pyodbc. Cette commande installe l’interface Python, mais pas le pilote ODBC de Microsoft. Installez séparément un pilote ODBC pour SQL Server sur la machine ou dans le conteneur où s’exécute le programme, et vérifiez que son nom correspond exactement à celui du pilote installé. Un nom courant est ODBC Driver 18 for SQL Server ; utilisez le nom disponible sur votre système.
Avant de vous connecter, récupérez l’adresse du serveur et le nom de la base de données. Le serveur peut être désigné par un nom d’hôte, une adresse ou un nom d’hôte suivi d’un nom d’instance, par exemple db.example.net\SQLEXPRESS ; les déploiements hébergés peuvent également nécessiter un port. Votre administrateur devra peut-être accorder au compte l’accès à la base de données choisie. Les informations de connexion à SQL Server ne dépendent pas du répertoire de travail Python, mais le pilote doit être accessible au gestionnaire ODBC du système d’exploitation.
Se connecter avec un pilote et l’authentification intégrée
Dans un environnement Windows configuré pour l’authentification intégrée, utilisez une chaîne de connexion fondée sur un pilote avec Trusted_Connection=yes. Remplacez les valeurs du pilote, du serveur et de la base de données par celles de votre installation. Le petit programme ci-dessous construit et affiche la chaîne afin que vous puissiez vérifier comment ses champs sont assemblés ; il ne contacte pas de base de données.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
driver = "ODBC Driver 18 for SQL Server"
server = "db.example.net"
database = "Sales"
connection_string = (
f"Driver={{{driver}}};"
f"Server={server};"
f"Database={database};"
"Trusted_Connection=yes;"
)
print(connection_string)
Driver={ODBC Driver 18 for SQL Server};Server=db.example.net;Database=Sales;Trusted_Connection=yes;
Pour ouvrir la connexion dans votre application, transmettez cette chaîne à pyodbc.connect(connection_string). L’authentification intégrée utilise l’identité dont dispose le processus et dépend de la configuration du système d’exploitation, du pilote et de SQL Server ; elle ne correspond pas à la saisie d’un nom d’utilisateur et d’un mot de passe SQL Server. Pour configurer TLS, suivez la politique de certificats de votre organisation. Les paramètres de chiffrement par défaut peuvent varier selon les versions du pilote ; ne désactivez pas les vérifications de certificats dans le seul but de faire aboutir la connexion.
Se connecter via un DSN avec des identifiants
Un nom de source de données (Data Source Name, DSN) est une configuration ODBC créée sur l’hôte. Elle peut contenir les paramètres partagés du serveur et du pilote ; l’application n’a alors qu’à fournir le nom du DSN et, si nécessaire, les identifiants. La chaîne de connexion peut prendre la forme DSN=SalesReadOnly;UID=app_reader;PWD=<secret>;. Le DSN doit exister dans le même environnement et être accessible au processus Python ; un DSN configuré pour un utilisateur interactif peut ne pas être disponible pour un compte de service ou un conteneur.
Fournissez les identifiants au moyen d’un gestionnaire de secrets ou d’une configuration propre à l’environnement, au lieu de les enregistrer dans le code source. Si votre secret contient des caractères spéciaux, appliquez les règles de guillemets prises en charge par les chaînes de connexion ODBC ou configurez les identifiants séparément ; sinon, un point-virgule pourrait être interprété comme séparateur de champs. Évitez d’afficher la chaîne de connexion complète, car le mot de passe pourrait se retrouver dans les journaux. Utilisez le même appel pyodbc.connect(...) avec la chaîne du DSN, puis choisissez l’authentification intégrée ou l’authentification SQL selon la configuration du DSN et du serveur.
Exécuter une requête et fermer les ressources
Après la connexion, créez un curseur, exécutez une requête SQL, puis récupérez les lignes renvoyées ou parcourez-les. Utilisez des marqueurs de paramètres pour les valeurs provenant des utilisateurs ou des données de l’application. Avec pyodbc, ? est le marqueur positionnel ; transmettre les valeurs séparément les distingue du texte SQL. Les paramètres servent à fournir des valeurs de données, et non des noms de tables ou de colonnes. Si un identifiant doit varier, choisissez-le dans une liste d’autorisation fixe et citez-le conformément aux règles de SQL Server.
Un déroulement courant consiste à appeler connection = pyodbc.connect(connection_string), puis cursor = connection.cursor() et cursor.execute("SELECT name FROM dbo.Customers WHERE customer_id = ?", customer_id). Parcourez cursor pour traiter les lignes, ou appelez fetchall() si le résultat est assez petit pour tenir en mémoire. Pour les grands résultats, traitez les lignes au fur et à mesure. La requête suppose que la table et la colonne indiquées existent dans la base sélectionnée ; remplacez-les par celles de votre schéma.
Une fois connection = pyodbc.connect(connection_string) exécuté avec succès, placez le travail sur le curseur dans un bloc try et fermez la connexion dans sa clause finally : try: ... finally: connection.close(). Pour fermer le curseur, utilisez with connection.cursor() as cursor: dans ce bloc ; la sortie du contexte ferme le curseur. Un contexte de connexion pyodbc tel que with connection: gère la portée de la transaction : il valide les changements à la sortie normale et les annule si une exception se propage, mais ne ferme pas la connexion. Vous pouvez combiner ce contexte de transaction avec celui du curseur dans le bloc try, puis appeler connection.close() dans finally. La connexion est ainsi fermée après le traitement de la requête, qu’il se termine normalement ou par une exception, à condition qu’elle ait été ouverte avec succès. Si vous modifiez des données, déterminez explicitement à quel moment valider la transaction. Ce mode d’utilisation nécessite un serveur SQL, un pilote et un schéma configurés ; il n’a pas été exécuté dans le cadre de cet article.
Diagnostiquer les erreurs de connexion courantes
Si pyodbc indique qu’un pilote est introuvable, vérifiez que le pilote ODBC est installé dans l’environnement d’exécution du programme et que la valeur Driver={...} correspond à son nom enregistré, espaces et numéro de version compris. Si le serveur est inaccessible, vérifiez le DNS ou l’orthographe du nom d’hôte, les paramètres du port et de l’instance, l’accès au pare-feu ainsi que l’acceptation des connexions réseau par SQL Server. Une expiration de délai indique généralement un problème de connectivité ou une charge élevée du serveur ; augmenter le délai ne corrigera pas une destination erronée.
En cas d’échec de connexion, vérifiez quelle identité la connexion utilise réellement. L’authentification intégrée utilise l’identité du processus, tandis que UID et PWD demandent des identifiants SQL ; mélanger ces méthodes peut entraîner l’utilisation de la mauvaise identité. Vérifiez ensuite les droits d’accès à la base de données et son nom. En cas d’erreur de certificat ou de chiffrement, demandez à votre administrateur de vérifier la chaîne de certificats du serveur et les paramètres de chiffrement du pilote plutôt que d’affaiblir les contrôles. Enfin, recherchez dans la chaîne de connexion les points-virgules manquants, les accolades non appariées autour des noms de pilotes, les espaces accidentels dans les clés ou les caractères spéciaux qui n’ont pas été échappés. Conservez des journaux de diagnostic utiles, mais masquez les mots de passe et les autres secrets.
Pour en savoir plus sur les pilotes et les chaînes de connexion, consultez les instructions de connexion SQL Server de pyodbc et la documentation officielle de pyodbc. Pour un exemple connexe de lecture des résultats d’une requête, consultez Comment extraire des éléments d’une base de données avec fetchall() en Python. Aucune destination française n’est disponible pour cet article connexe.