1. Les "requêtes N+1" : le tueur silencieux
Tu affiches 100 livres avec leur auteur… et ton app fait 101 requêtes SQL.
Exemple :
for livre in livres:
print(livre.auteur.nom) # Une requête par auteur… Oups !
👉 Résultat ? Une page qui charge… pendant 5 secondes.
La métaphore :
C’est comme aller 100 fois au distributeur pour retirer 1€ à chaque fois.
Alors que tu pourrais tout retirer en une seule fois.
Solution : Apprends à utiliser le chargement immédiat (eager loading).
Exemple : Livres.avec_auteurs().tous() → Une seule requête.
2. Une fausse impression de simplicité
"C’est simple, donc c’est bien."
Pas toujours.
L’ORM fait plein de choses en arrière-plan. Parfois, il génère du SQL lourd, inefficace, ou inattendu.
"Mais pourquoi cette requête prend 2 secondes ?!"
Parce que ton ORM a fait un JOIN sur 5 tables… sans que tu le saches.
👉 Conseil d’humain à humain :
Active les logs SQL. Regarde ce que ton ORM envoie à la base.
Tu serais surpris de ce que tu découvres.
3. Tu perds le contrôle du SQL
Quand tu dois optimiser une requête complexe (analyse de données, rapports, etc.), l’ORM peut devenir un frein.
"Je veux juste faire un WITH RECURSIVE ou un GROUP BY personnalisé…"
Parfois, c’est plus simple… d’écrire du SQL brut.
Et ce n’est pas une faiblesse. C’est de la sagesse.
4. Les migrations deviennent un cauchemar
Dans un petit projet, générer des migrations automatiquement, c’est génial.
Mais dans un projet de 2 ans, avec 50 tables et des données critiques ?
👉 Une mauvaise migration peut tout casser.
"Qui a modifié le champ user_id en author_id sans prévenir ?!"
Astuce :
Écris tes migrations manuellement, avec des commentaires clairs.
Et teste-les en pré-production.