Vue d'ensemble

SQLAlchemy 2.1, publie le 16 mars 2025, introduit les relations write-only et ameliore les performances des requetes.

Fonctionnalites principales

Relations write-only

Les relations WriteOnlyMapped evitent le chargement en memoire de grandes collections. Les elements sont ajoutes ou supprimes sans charger la collection entiere.

python
from sqlalchemy.orm import DeclarativeBase, Mapped, WriteOnlyMapped
from sqlalchemy.orm import mapped_column, relationship
from sqlalchemy import ForeignKey

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = 'users'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str]
    # Grande collection : write-only
    logs: WriteOnlyMapped[list['Log']] = relationship()

class Log(Base):
    __tablename__ = 'logs'
    id: Mapped[int] = mapped_column(primary_key=True)
    user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
    message: Mapped[str]

Performances ameliorees

Le compilateur de requetes est optimise pour generer du SQL plus efficace, avec un meilleur support du batching pour les insertions.

python
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session

engine = create_engine('sqlite:///app.db')

with Session(engine) as session:
    # Insertion par batch optimisee
    session.add_all([
        User(name=f'user_{i}') for i in range(1000)
    ])
    session.commit()

    # Requete optimisee
    stmt = select(User).where(User.name.like('user_1%'))
    users = session.scalars(stmt).all()

Sources