SQLAlchemy¶
Requête et optimisation des chargements¶
Filtrage sur une relation¶
Pour filtrer sur les relations d’un objet on va utiliser
join ou outerjoin (selon le type de relation)
filter()
ManyToOne relationship
>>> query = db().query(Project).outerjoin(Project.company).filter(Company.name.like('%a%'))
OneToMany relationship
>>> query = db().query(Project).outerjoin(Project.customers).filter(Project.customers.any(Customer.name.like('%a%')))
Optimisation du chargement¶
Pour optimiser le chargement de données, on va utiliser load_only, qui va permettre de limiter les colonnes à requérir :
>>> from sqlalchemy.orm import load_only
>>> query = Project.query().options(load_only('id', 'name'))
Note : Pour les relations les join ne chargent pas de données. Lorsque l’on va accéder à project.customers[0].name, on va faire une nouvelle requête sur la table customer.
Donc pour faire la même chose sur des relations que l’on charge simultanément, on va utiliser
selectinload
load_only
>>> query = db().query(Project).options(selectinload(Project.customers).load_only('id', 'label'))
Si on veut cumuler le filtrage et le chargement des informations, on utilisera la requête suivante.
>>> query = db().query(Project).options(selectinload(Project.customers).load_only('id', 'label')).outerjoin(Project.customers).filter(Customer.name.like('%a%'))