Configurer une session avec SQLAlchemy pour des transactions

Configurer une session avec SQLAlchemy permet de gérer des interactions avec la base de données de manière cohérente et contrôlée. Cela inclut des transactions qui garantissent que les modifications apportées aux données soient correctement validées (commit) ou annulées (rollback) en cas d’erreur, assurant ainsi l’intégrité des données.

Fonctions :

  • Configurer une session

    La session SQLAlchemy est l’interface principale pour gérer la communication avec la base de données en mode ORM. Elle permet de : Effectuer des transactions complexes (ajouts, suppressions, modifications, etc.). Contrôler les transactions (commit, rollback). Gérer les cycles de vie des objets chargés depuis la base de données. La configuration d'une session via sessionmaker() permet de créer plusieurs instances de session réutilisables, adaptées aux applications complexes (transactions multiples, rollback sur erreur, etc.).

    Importation :

    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker

    Attributs :

    Paramètre Type Description
    bind Engine ou Connection L’engine ou la connexion auquel la session est liée
    autocommit (optionnel) bool Si True, les transactions sont automatiquement validées (déconseillé)
    expire_on_commit (optionnel) bool Si False, les objets restent accessibles après commit sans rechargement

    Exemple de code :

    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    # Création de l'engine de connexion
    engine = create_engine('sqlite:///base_de_donnees.db')
    
    # Création du factory de sessions
    Session = sessionmaker(bind=engine)
    
    # Démarrage d'une session
    session = Session()
    
    try:
        # Exemple de transaction complexe
        utilisateur = Utilisateur(nom='Jean', age=28)
        session.add(utilisateur)
        
        produit = Produit(nom='Clavier', prix=49.99)
        session.add(produit)
        
        # Commit de la transaction
        session.commit()
        
    except Exception as e:
        print("Erreur détectée :", e)
        
        # Annulation en cas d'erreur
        session.rollback()
    
    finally:
        # Fermeture de la session
        session.close()

    Explication du code :

    • Session = sessionmaker(bind=engine) : crée une fabrique de sessions liée à l'engine. On utilise Session() pour ouvrir une nouvelle session.
    • Le bloc try permet d'enchaîner plusieurs actions dans une même transaction.
    • Si une erreur se produit, rollback() annule les changements depuis le début de la transaction.
    • commit() confirme définitivement les changements en base.
    • session.close() libère les ressources de la session après utilisation.

    Remarques

    • Transactions complexes : il est important de regrouper plusieurs opérations dans une même session lorsque celles-ci dépendent les unes des autres. Un rollback garantit l'intégrité des données si une étape échoue.

    • Best practice : toujours utiliser un try...except...finally pour :

      • Faire commit() en cas de succès.
      • Faire rollback() en cas d'erreur.
      • Fermer proprement la session.
    • Session longue : si une session reste ouverte trop longtemps, cela peut poser des problèmes de verrouillage de la base de données et de consommation mémoire.

    • Expire on commit : par défaut, SQLAlchemy expurge les objets en mémoire après un commit().