Čo je Django ORM?
Object-Relational Mapping (ORM) vytvára prepojenie medzi objektmi v aplikácii a tabuľkami v databáze.
Namiesto písania SQL:
SELECT * FROM products WHERE price > 100;
môžeme v Django použiť:
Product.objects.filter(price__gt=100)
Django ORM tento Python kód preloží do SQL dotazu, ktorý následne vykoná databáza.
Vývojári tak môžu väčšinu databázových operácií riešiť priamo v Pythone.
Prečo používať Django ORM?
ORM ponúka pri každodennom vývoji niekoľko výhod.
1. Rýchlejší vývoj
Vývojári nemusia pre každú operáciu manuálne písať SQL. Django poskytuje API na filtrovanie, triedenie, vytváranie, aktualizáciu aj mazanie záznamov.
2. Čitateľnejší kód
Pre vývojárov pracujúcich s Django môže byť napríklad:
Product.objects.filter(category="books")
prehľadnejší a ľahšie pochopiteľný ako manuálne napísané SQL.
3. Bezpečnejšia práca s parametrami
ORM pomáha chrániť aplikácie pred niektorými typmi chýb, napríklad SQL injection, tým, že hodnoty parametrizuje namiesto ich priameho vloženia do SQL reťazca.
Samotné používanie ORM však, samozrejme, neznamená, že celá aplikácia je automaticky bezpečná.
4. Jednoduchšia abstrakcia databázy
Django ORM abstrahuje niektoré rozdiely medzi rôznymi databázovými systémami. Ak napríklad aplikácia používa PostgreSQL, vývojári väčšinou nemusia písať každý dotaz so zreteľom na špecifickú syntax konkrétnej databázy.
Kedy môže byť ORM problém?
Django ORM je výkonný nástroj, ale každá abstrakcia má svoje limity.
Častý problém vzniká vtedy, keď ORM vytvorí SQL dotaz, ktorý síce funguje správne, ale nie je dostatočne efektívny.
Napríklad:
orders = Order.objects.all()
for order in orders:
print(order.customer.name)
Na prvý pohľad vyzerá kód úplne bez problémov. Ak sa však customer nenačíta spolu s objednávkami, aplikácia môže pre každú objednávku vykonať samostatný databázový dotaz.
Namiesto niekoľkých dotazov tak môže vzniknúť takzvaný N+1 Query Problem.
To však automaticky neznamená, že musíme ORM opustiť. Django ponúka nástroje ako select_related() a prefetch_related(), pomocou ktorých je možné počet databázových dotazov optimalizovať.
Z toho vyplýva dôležitý princíp:
Ak je ORM pomalé, prvým krokom by nemalo byť automaticky použitie Raw SQL. Najskôr treba zistiť, prečo je dotaz pomalý.
Kedy má zmysel Raw SQL?
Raw SQL znamená, že SQL dotaz píšeme priamo. Vývojári tak získajú väčšiu kontrolu nad tým, čo sa databáze posiela.
Raw SQL môže byť užitočné napríklad vtedy, keď:
- potrebujeme veľmi špecifický databázový dotaz,
- chceme využiť pokročilé funkcie konkrétnej databázy,
- ORM nedokáže dotaz dostatočne efektívne vyjadriť,
- pracujeme s komplexnými analytickými dotazmi,
- potrebujeme presnú kontrolu nad výkonom dotazu.
PostgreSQL napríklad ponúka množstvo pokročilých funkcií, ktoré nemusia mať v Django ORM priamu alebo rovnako pohodlnú reprezentáciu.
V takýchto prípadoch môže byť jednoduchšie a efektívnejšie napísať SQL priamo.

Raw SQL nie je automaticky rýchlejšie
Ide o jeden z najčastejších omylov.
Použitie Raw SQL automaticky neznamená, že aplikácia bude rýchlejšia.
Ak ORM už vytvára efektívny SQL dotaz, manuálne napísaná alternatíva nemusí priniesť žiadne zlepšenie výkonu. Môže byť dokonca náročnejšia na údržbu a náchylnejšia na chyby.
Pred optimalizáciou je preto dôležité najskôr zistiť, kde skutočný problém vzniká.
Pomôcť môžu napríklad:
- SQL Query Logging,
- Django Debug Toolbar,
- EXPLAIN a EXPLAIN ANALYZE v PostgreSQL,
- monitoring databázy,
- meranie času vykonávania jednotlivých dotazov.
Optimalizovať databázu bez predchádzajúceho merania je často len odhad.
ORM a Raw SQL môžu fungovať spolu
Nie je potrebné vybrať si iba jeden prístup.
V jednej aplikácii môže väčšina databázových operácií fungovať cez Django ORM, zatiaľ čo niekoľko špecifických dotazov môže využívať Raw SQL.
Django umožňuje kombinovať oba prístupy. ORM tak môžeme používať tam, kde prináša jednoduchosť a produktivitu, zatiaľ čo SQL využijeme tam, kde potrebujeme väčšiu kontrolu.
V mnohých prípadoch je tento prístup praktickejší než snaha používať jeden nástroj na všetko.
Ako sa rozhodnúť?
Pri rozhodovaní si môžeme položiť niekoľko jednoduchých otázok:
Je dotaz bežný a dá sa jednoducho vyriešiť pomocou ORM?
→ Použite ORM.
Je ORM dotaz pomalý?
→ Najskôr zistite prečo a skontrolujte skutočne generované SQL.
Dá sa problém vyriešiť pomocou select_related(), prefetch_related() alebo inej ORM optimalizácie?
→ Zostaňte pri ORM.
Potrebujete konkrétnu databázovú funkciu alebo veľmi komplexný dotaz?
→ Raw SQL môže byť vhodnejšou voľbou.
Je výkon kritický a SQL by vám poskytlo lepšiu kontrolu?
→ Zvážte Raw SQL, ale najskôr rozdiel zmerajte.
ORM alebo SQL? Správna odpoveď je často oboje
Django ORM je jedným z dôvodov, prečo je Django efektívnym frameworkom na vývoj webových aplikácií. Umožňuje vývojárom pracovať s databázami pohodlne a rýchlo a zároveň obmedzuje množstvo opakujúceho sa kódu.
Raw SQL má však svoje miesto v situáciách, keď potrebujeme väčšiu kontrolu alebo chceme využiť špecifické možnosti databázy.
Najdôležitejšie preto nie je vybrať si medzi ORM a SQL raz a navždy. Dobrá aplikácia používa správny nástroj na konkrétny problém.
Začnite s ORM. Merajte výkon. Optimalizujte. A ak zistíte, že ORM už nestačí, siahnite po SQL.