Exécuter des requêtes SQL via SQLAlchemy (session.execute()) (
SQLAlchemy permet d’exécuter des requêtes SQL directement via la méthode session.execute(), ce qui permet d’effectuer des opérations comme des requêtes de sélection, des mises à jour ou des suppressions, en utilisant SQL pur. Cela peut être utile lorsque vous avez besoin d’exécuter des requêtes spécifiques non couvertes par les fonctions ORM de SQLAlchemy.
Fonctions :
-
session.execute()
La méthode session.execute() permet d’exécuter des requêtes SQL brutes ou des requêtes générées avec SQLAlchemy Core dans une session ORM. C'est utile lorsque vous souhaitez : Utiliser des commandes SQL personnalisées. Faire des jointures complexes non couvertes par l'ORM. Accéder directement aux fonctionnalités spécifiques du SGBD. La méthode retourne un objet Result contenant les résultats de la requête, accessibles via des itérations ou des méthodes comme .fetchall().
Importation :
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker
Attributs :
Paramètre Type Description statement
str ou TextClause La requête SQL à exécuter ou un objet SQLAlchemy text()
params
dict Paramètres optionnels pour exécuter une requête paramétrée Exemple de code :
from sqlalchemy import create_engine, text from sqlalchemy.orm import sessionmaker # Création de l'engine et de la session engine = create_engine('sqlite:///base_de_donnees.db') Session = sessionmaker(bind=engine) session = Session() # Exemple 1 : Exécuter une requête SELECT simple result = session.execute('SELECT * FROM utilisateurs') # Afficher les résultats for row in result: print(row) # Exemple 2 : Requête avec paramètre (sécurisé) query = text('SELECT * FROM utilisateurs WHERE age > :age_min') result = session.execute(query, {'age_min': 25}) # Afficher les résultats for row in result: print(f"Nom : {row.nom}, Age : {row.age}") # Fermer la session session.close()
Explication du code :
- Création d'une session : on utilise
sessionmaker()
pour générer une session qui sera liée à l'engine. - Requête brute :
session.execute('SELECT * FROM utilisateurs')
exécute une requête SQL classique. - Paramétrage sécurisé :
text()
permet de créer des requêtes paramétrées, empêchant les injections SQL. - Les résultats sont parcourus comme un itérable : chaque
row
est une ligne du résultat, accessible via des attributs (row.nom
), des index (row[0]
) ou des clés (row['nom']
).
Remarques
-
Sécurité : il est recommandé d'utiliser
text()
avec des paramètres pour éviter les injections SQL, surtout si des données utilisateurs sont impliquées. -
Transactions : par défaut, les opérations sont dans une transaction. Pensez à faire un
session.commit()
pour les commandesINSERT
,UPDATE
ouDELETE
, ousession.rollback()
si une erreur survient. -
Performance :
session.execute()
est plus flexible mais peut être plus lent que des opérations ORM standard pour des requêtes simples. -
Compatibilité : le SQL brut dans
session.execute()
dépend du moteur de base de données sous-jacent (SQLite, PostgreSQL, etc.).
- Création d'une session : on utilise