Co je Django ORM?
Object-Relational Mapping (ORM) vytváří propojení mezi objekty v aplikaci a tabulkami v databázi.
Místo psaní SQL:
SELECT * FROM products WHERE price > 100;
můžeme v Django použít:
Product.objects.filter(price__gt=100)
Django ORM tento Python kód přeloží do SQL dotazu, který následně databáze provede.
Vývojář tak může většinu databázových operací řešit přímo v Pythonu.
Proč používat Django ORM?
Pro běžný vývoj má ORM řadu výhod.
1. Rychlejší vývoj
Vývojář nemusí pro každou operaci ručně psát SQL. Django poskytuje API pro filtrování, řazení, vytváření, aktualizaci i mazání záznamů.
2. Čitelnější kód
Pro vývojáře pracujícího v Django může být:
Product.objects.filter(category="books")
čistší a srozumitelnější než ručně napsaný SQL dotaz.
3. Bezpečnější práce s parametry
ORM pomáhá chránit aplikaci před některými typy chyb, například SQL injection, protože hodnoty parametrizuje místo toho, aby je jednoduše vkládalo do SQL řetězce.
To samozřejmě neznamená, že samotné použití ORM automaticky zajistí bezpečnost celé aplikace.
4. Jednodušší změna databáze
Django ORM abstrahuje část rozdílů mezi databázovými systémy. Pokud aplikace používá například PostgreSQL, vývojář většinou nemusí psát každý dotaz s ohledem na konkrétní databázovou syntaxi.
Kdy může být ORM problém?
Django ORM je velmi schopný nástroj, ale abstrakce má své limity.
Jedním z nejčastějších problémů je situace, kdy ORM vytvoří SQL dotaz, který sice funguje, ale není dostatečně efektivní.
Například můžeme napsat:
orders = Order.objects.all()
for order in orders:
print(order.customer.name)
Na první pohled je kód jednoduchý. Pokud ale customer není načtený společně s objednávkami, může aplikace provést samostatný databázový dotaz pro každou objednávku.
Místo jednoho nebo několika dotazů tak může vzniknout N+1 query problem.
V takovém případě ale nemusíme hned opouštět ORM. Django nabízí nástroje jako select_related() a prefetch_related(), které umožňují počet dotazů optimalizovat.
To je důležitý princip:
Pokud je ORM pomalé, první krok by neměl být automaticky raw SQL. Nejprve zjistěte, proč je dotaz pomalý.
Kdy dává smysl Raw SQL?
Raw SQL znamená, že SQL dotaz píšeme přímo a máme větší kontrolu nad tím, co databázi posíláme.
Může být užitečné například v situacích, kdy:
- potřebujeme velmi specifický databázový dotaz,
- využíváme pokročilé funkce konkrétní databáze,
- ORM nedokáže dotaz vyjádřit dostatečně efektivně,
- pracujeme s komplexními analytickými dotazy,
- potřebujeme přesně kontrolovat výkon dotazu.
Například PostgreSQL nabízí řadu funkcí a možností, které nemusí mít v Django ORM přímou nebo stejně pohodlnou reprezentaci.
V takovém případě může být jednodušší a efektivnější napsat SQL přímo.

Raw SQL ale není automaticky rychlejší
Tohle je jeden z nejčastějších omylů.
Použití raw SQL samo o sobě neznamená, že aplikace bude rychlejší.
Pokud ORM vytvoří efektivní SQL dotaz, ručně napsaná alternativa nemusí přinést žádné zlepšení. Naopak může být složitější na údržbu a snadněji se v ní udělá chyba.
Před optimalizací je proto důležité zjistit, kde problém skutečně vzniká.
Pomoci mohou například:
- SQL query logging,
- Django Debug Toolbar,
- EXPLAIN a EXPLAIN ANALYZE v PostgreSQL,
- monitoring databáze,
- měření času jednotlivých dotazů.
Optimalizovat databázi bez měření je často jen odhad.
ORM a Raw SQL mohou fungovat společně
Nemusíme si vybrat pouze jednu možnost.
V jedné aplikaci může být naprostou většinou databázových operací obsluhována přes Django ORM a jen několik specifických dotazů může využívat raw SQL.
Django dokonce umožňuje kombinovat oba přístupy. Vývojář tak může používat ORM tam, kde přináší jednoduchost a produktivitu, a SQL tam, kde je potřeba větší kontrola.
Tento přístup bývá často praktičtější než snaha používat pouze jeden nástroj pro všechno.
Jak se rozhodnout?
Můžeme si položit několik jednoduchých otázek:
Je dotaz běžný a dobře řešitelný pomocí ORM?
→ Použijte ORM.
Je ORM dotaz pomalý?
→ Nejprve zjistěte proč a podívejte se na skutečné SQL.
Lze problém vyřešit pomocí select_related(), prefetch_related() nebo jinou ORM optimalizací?
→ Zůstaňte u ORM.
Potřebujete specifickou databázovou funkci nebo velmi komplexní dotaz?
→ Raw SQL může být vhodnější.
Je výkon kritický a SQL vám umožní získat lepší kontrolu?
→ Zvažte raw SQL, ale ověřte rozdíl měřením.
ORM nebo SQL? Správná odpověď je často obojí
Django ORM je jedním z důvodů, proč je Django efektivní framework pro vývoj webových aplikací. Umožňuje vývojářům pracovat s databází pohodlně, rychle a s menším množstvím opakujícího se kódu.
Raw SQL má ale své místo tam, kde potřebujeme větší kontrolu nebo využít možnosti konkrétní databáze.
Nejdůležitější proto není rozhodnout se mezi ORM a SQL jednou provždy. Dobrá aplikace používá správný nástroj pro konkrétní problém.
Začněte ORM. Měřte výkon. Optimalizujte. A pokud zjistíte, že ORM už nestačí, teprve potom sáhněte po SQL.