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 commandes INSERT, UPDATE ou DELETE, ou session.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.).