Utiliser les transactions avec SQLAlchemy pour garantir la cohérence des données
Les transactions avec SQLAlchemy permettent de garantir la cohérence des données en regroupant plusieurs opérations en une seule unité. Une transaction assure que, si une erreur survient, toutes les modifications effectuées jusqu’à ce point sont annulées (rollback), et si tout se passe bien, les modifications sont validées (commit), ce qui garantit que la base de données reste dans un état valide.
Fonctions :
-
Utiliser les transactions
Les transactions en SQLAlchemy permettent de regrouper plusieurs opérations en un seul bloc atomique. Cela garantit que : Toutes les opérations sont validées (commit()) ensemble si aucune erreur n’est survenue. En cas d’échec, toutes les opérations sont annulées (rollback()), maintenant la base de données dans un état cohérent. Les transactions sont essentielles pour préserver l'intégrité des données, en particulier dans les applications critiques où les échecs partiels ne sont pas tolérables.
Importation :
from sqlalchemy.orm import sessionmaker
Attributs :
Méthode Description session.commit()
Valide définitivement les opérations de la transaction en cours. session.rollback()
Annule toutes les modifications effectuées depuis le dernier commit()
.session.close()
Ferme la session et libère les ressources associées. Exemple de code :
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from modele import Utilisateur # Exemple : modèle ORM défini avec SQLAlchemy # Création de l'engine et de la session engine = create_engine('sqlite:///base_de_donnees.db') Session = sessionmaker(bind=engine) session = Session() try: # Ajout d'un nouvel utilisateur nouvel_utilisateur = Utilisateur(nom='Sophie', age=27) session.add(nouvel_utilisateur) # Supposons une autre opération dépendante # Exemple : mise à jour d'un autre utilisateur autre_utilisateur = session.query(Utilisateur).filter_by(nom='Pierre').first() if autre_utilisateur: autre_utilisateur.age += 1 # Validation des deux opérations comme une seule transaction session.commit() print("Transaction réussie !") except Exception as e: # Si une erreur survient, on annule tout session.rollback() print(f"Erreur détectée : {e}. Transaction annulée.") finally: # On ferme la session session.close()
Explication du code :
session.add()
etsession.query()
sont regroupés dans une même transaction.- Si tout se passe bien,
session.commit()
valide définitivement les changements. - Si une exception est levée (par exemple, un problème d'accès à la base ou une erreur logique),
session.rollback()
annule l'ensemble des modifications faites depuis la dernière validation. session.close()
est appelé en fin de traitement pour libérer la connexion à la base de données.
Remarques
-
Principe ACID : SQLAlchemy respecte les principes des transactions ACID (Atomicité, Cohérence, Isolation, Durabilité) en utilisant
commit()
etrollback()
. -
Toujours encapsuler dans un try/except/finally :
try
: logique principaleexcept
: rollback et gestion d'erreursfinally
: fermeture de la session
-
Rollback partiel :
- Une transaction annulée avec
rollback()
remet toutes les opérations de la session au derniercommit()
(ou depuis le début si aucuncommit()
n’a eu lieu).
- Une transaction annulée avec
-
Utilisation dans des frameworks web :
- Il est recommandé d'utiliser un scope par requête web avec
scoped_session()
pour éviter des erreurs de session persistantes.
- Il est recommandé d'utiliser un scope par requête web avec