#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Module de gestion des connexions à la base de données.
"""
import pymysql
def ouvrir_session_bd():
connexion = pymysql.connect(
host='localhost',
port=3306,
user='admin_bd',
password='secret123',
database='app_data',
charset='utf8mb4')
curseur = connexion.cursor(pymysql.cursors.DictCursor)
return connexion, curseur
if __name__ == '__main__':
connexion, curseur = ouvrir_session_bd()
Pour exécuter des opérations SQL, on crée d'abord un objet curseur avec la méthode cursor(). Par défaut, les résultats sont retournés sous forme de liste ; pour obtenir des dictionnaires, spécifier pymysql.cursors.DictCursor :
curseur = connexion.cursor(cursor=pymysql.cursors.DictCursor)
L'exécution de requêtes SQL peut se faire avec des paramètres sécurisés via des espaces réservés %s. Différentes structures de données peuvent être utilisées :
Avec un dictionnaire :
donnees_filtre = {'nom': 'Alice', 'age': 30}
requete = "SELECT * FROM utilisateurs WHERE nom = %(nom)s AND age = %(age)s"
curseur.execute(requete, donnees_filtre)
Avec une liste :
parametres = ['Bob', 25]
requete = "SELECT * FROM utilisateurs WHERE nom = %s AND age = %s"
curseur.execute(requete, parametres)
Avec un tuple :
valeurs = ('Charlie', 40)
requete = "SELECT * FROM utilisateurs WHERE nom = %s AND age = %s"
curseur.execute(requete, valeurs)
Les espaces réservés garantissent une injection SQL évitée, et l'ordre des paramètres doit correspondre aux marqueurs dans le cas des listes ou tuples.
Pour valider les modifications dans la base, on appelle commit() si l'autocommit est désactivé :
connexion.commit()
Pour récupérer les résultats, on utilise :
fetchall()pour obtenir toutes les lignes sous forme de liste de dictionnaires ou tuples, retournant une liste vide si aucun résultat.fetchone()pour obtenir une seule ligne sous forme de dictionnaire ou tuple, ouNonesi aucun résultat.
Enfin, il est crucial de fermer proprement la connexion :
connexion.close()
Exemple d'aplication pratique dans une classe pour intreroger des données :
from module_connexion import ouvrir_session_bd
class AnalyseSalles():
@staticmethod
def nombre_salles_actives():
conn, cur = ouvrir_session_bd()
try:
requete_sql = '''SELECT s.id_salle, d.nom_departement
FROM salles s
JOIN departements d ON s.id_departement = d.id
WHERE s.statut = 'actif'
AND s.type_salle IN ('standard', 'special', 'vip')
AND d.actif = 1'''
cur.execute(requete_sql)
enregistrements = cur.fetchall()
compteur = len(enregistrements)
return compteur
finally:
cur.close()
conn.close()