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() et session.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() et rollback().

    • Toujours encapsuler dans un try/except/finally :

      • try: logique principale
      • except: rollback et gestion d'erreurs
      • finally: fermeture de la session
    • Rollback partiel :

      • Une transaction annulée avec rollback() remet toutes les opérations de la session au dernier commit() (ou depuis le début si aucun commit() n’a eu lieu).
    • 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.