GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

SQL Server avec Python

Manipuler SQL Server avec Python

Utilisation avec Debian

Commencez par installer le module pyodbc pour Python. pip install pyodbc

Installer le driver ODBC

Sous Windows le driver SQL est déjà installé par défaut. Sous les environnements type Linux, ce n'est pas le cas. Il faut installer les clés des packages Microsoft.

curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
			curl https://packages.microsoft.com/config/debian/12/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
Mettre ensuite à jour votre liste de sources de paquets et installer le driver ODBC.
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
# optionnel: pour bcp et sqlcmd
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools18
echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
source ~/.bashrc

Se connecter au serveur SQL

Pour se connecter, utilisez une chaine de connexion de ce type :

import pyodbc

server='nom ou ip du serveur sql'
username='identifiant de connexion SQL'
password='mot de passe de connexion'

conn = pyodbc.connect(f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};UID={username};PWD={password};Encrypt=No')

Depuis les dernière version des drivers ODBC ainsi que du moteur SQL, Microsoft a ajouté par défaut un certificat X.509 auto-signé. C'est l'objet de l'option Encrypt={Yes | No} dans la chaîne de connexion. Si vous ne mentionnez pas cette option, c'est Encrypt=yes qui est définie par défaut. Il vous faut donc disposer du certificat dans votre gestionnaire de certificats local ou bien utiliser le paramètre TrustServerCertificates=yes dans la chaine de connexion.

conn = pyodbc.connect(f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};UID={username};PWD={password};TrustServerCertificate=yes')

Si vous utilisez cette chaine avec d'autres interfaces de programmation comme ADO.Net ou JDBC, il faudra spécifier TrustServerCertificate=true au lieu de TrustServerCertificate=yes...

Si vous ne voulez pas vous poser de questions avec les certificats, faites simplement Encrypt=No dans la chaine de connexion, comme celle montrée un peu plus haut dans la page.

Lire des données avec python et SQL

Les fonctions utiles pour lire des résultats de requêtes SQL sont :

Comme pour toute base de données, il est conseillé d'accéder aux informations de la base par l'intermédiaire d'un curseur (cursor). Par exemple pour afficher la version du moteur SQL :

cursor = conn.cursor()
cursor.execute("Select @@VERSION")
row = cursor.fetchone()
while row:
    print(row[0])
    row = cursor.fetchone()
Ou bien pour afficher les bases de données disponibles :
cursor.execute("SELECT name,database_id,create_date,compatibility_level,page_verify_option,page_verify_option_desc,is_broker_enabled,service_broker_guid from sys.databases")
rows = cursor.fetchall()
for row in rows:
    print(row[0], " (ID=", row[1], ") - Created on ", row[2])
    print("Compatibility level : ", row[3])
    print("Page verify option : ", row[5])
    if (int(row[6]) == 1):
        print("Broker enabled")
    else:
        print("Broker disabled")
    print()

Insertion de lignes dans la base


# Création de la requête SQL
SQL_STATEMENT = """
	INSERT SalesLT.Product (
	Name, 
	ProductNumber, 
	StandardCost, 
	ListPrice, 
	SellStartDate
	) OUTPUT INSERTED.ProductID 
	VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
"""

# Utilisation d'un curseur pour exécuter la requête paramétrée
cursor.execute(
    SQL_STATEMENT,
    f'Example Product {productNumber}', 
    f'EXAMPLE-{productNumber}', 
    100,
    200
)

# Récupération de l'ID unique de la transaction
resultId = cursor.fetchval()
print(f"Inserted Product ID : {resultId}")
conn.commit()

# Fermeture du curseur et de la connexion à la base
cursor.close()
conn.close()
Tout comme commit() permet de valider la transaction, la méthode rollback() permet de faire marche arrière et de ne pas enregistrer les modifications réalisées depuis le dernier commit(). conn.rollback()

Références