Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Django: Databázový model podruhé

Honza Kral
Honza Kral (neregistrovaný) ---.net.upc.cz
4. 9. 2009 10:16 Nový

len vs .count() a dalsi drobnosti

celé vlákno

Ke zjistovani poctu zaznamu je nevhodne pouzivat funkci len – stahne vsechny zaznamy z DB a spocita je misto toho aby se proste DB zeptala na pocet (SELECT COUNT(*) …) jako do tela metoda .count()

Misto .filter()[0] je lepsi vetsinou pouzit .get(), ma tu vyhodu ze sam hlida ze DB ma vratit prave jeden objekt a neni tak krypticky.

Mozna by take stalo za to zminit lazy vlastnost querysetu a jak se daji querysety za sebou retezit, tedy ze muzu udelat

>>> q = Store.objects.all()
>>> q = q.filter(id__lte=10)
>>> q = q.exclude(id=1)
>>> q = q.order_by('-id')
>>> stores = q[:2]

A ve vysledku se udela jen jeden dotaz do DB. Obecne dotazy do DB se provedou pri iterovani pres queryset, sliceovani ([]) a volani .get ci .count. Specialni pripad je v ramci prace v interaktivnim rezimu, ktery vzdy vola repr() na vracene hodnote aby ho zobrazil uzivateli – repr() u querysetu vyvola iteraci a dotaz se tak provede.

Jinak dekuji za clanky, myslim si, ze je neco takoveho potreba :).

Pavel Dvořák
4. 9. 2009 10:34 Nový

Re: len vs .count() a dalsi drobnosti

celé vlákno

Díky za hodnotné připomínky, get jsem tam stručně zmínil, lenost a řetězení taky. S tím countem máte naprostou pravdu, je to efektivnější a neměl jsem o tom ani tušení. Django mě neustále překvapuje novými funkcemi…

Tomaasch
Tomaasch (neregistrovaný) 84.244.101.---
4. 9. 2009 10:49 Nový

Re: len vs .count() a dalsi drobnosti

celé vlákno

No, ten count() neni ani tak funkce Djanga, ale vychazi z vlastnosti SQL databaze. Navic tyto ‚nove funkce‘ jsou zminene i v originalni dokumentaci, takze to by Vas prilis prekvapovat nemelo – narazim hlavne na ‚.get()‘ metodu, ktera se od Vami popsanych vyberovych kriterii atributu object lisi jen tim, ze nevraci Queryset, ale primo vlastni objekt.

Pavel Dvořák
4. 9. 2009 10:57 Nový

Re: len vs .count() a dalsi drobnosti

celé vlákno

Ano, samozřejmě, databázovou klauzuli COUNT znám, jenom jsem nevěděl, že to má Django implementováno jako zvláštní metodu – příště musím lépe nastudovat manuál. A metodu get jsem tam zmínil a přiložil na ní odkaz, i když jsem ji v rámci zpřehlednění nepoužil, rozhodně s ní však budu pracovat v nějakém dalším díle.

jjjjj
jjjjj (neregistrovaný) ---.chello.sk
4. 9. 2009 17:33 Nový

limit

celé vlákno

neviete ako django robi limit napr. na DB oracle, alebo inych, ktore pojem limit nepoznaju?

pcicman
pcicman (neregistrovaný) 194.230.154.---
4. 9. 2009 18:12 Nový

Re: limit

celé vlákno

V tomto pripade django ide standardnou cestou cez vlozeny select a rownum, zbytok podobne ako u limit…

pcicman
pcicman (neregistrovaný) 194.230.154.---
4. 9. 2009 17:45 Nový

Q object?

celé vlákno

Kedze sa v clanku v hodnej miere spominaju metody QuerySet, a metoda filter (dokonca viac ako by mala), mozno stalo zato spomenut aj Q object.

Pavel Dvořák
5. 9. 2009 13:49 Nový

Re: Q object?

celé vlákno

Máte pravdu, Q objekt je hodně užitečná věc. Bohužel se to sem už nevešlo, databázový model Djanga je natolik komplexní, že by se jenom tomuto tématu dal věnovat celý seriál. Lepší je popsat jeden způsob pořádně než více povrchně.

Jirka Vejrazka
Jirka Vejrazka (neregistrovaný) 195.27.20.---
4. 9. 2009 21:34 Nový

Zjistovani vygenerovaneho SQL

celé vlákno

Ja bych si jenom dovolil doplnit, ze vygenerovane dotazy se do connection.queries ukladaji jenom pokud je v settings.py nastaveno DEBUG = True (a je to mimochodem hlavni duvod, proc si zacatecnici stezuji na memory leak v Djangu).

Pokud chceme zjistit SQL, je jednodussi na QuerySet objektu pouzit .query.as_sql()

store_brno = Store.objects­.filter(id=3)[0]
print store_brno.qu­ery.as_sql()

Snad to nekomu pomuze.

Jirka

Jirka Vejrazka
Jirka Vejrazka (neregistrovaný) 195.27.20.---
4. 9. 2009 23:45 Nový

Re: Zjistovani vygenerovaneho SQL

celé vlákno

Ehm, v tom prikladu mam samozrejme chybu, protoze store_brno neni QuerySet. Predstavte si, ze na za filter(…) neni ono [0] :-)

Honza Kral
Honza Kral (neregistrovaný) 12.157.240.---
7. 9. 2009 5:05 Nový

Re: Zjistovani vygenerovaneho SQL

celé vlákno

Ja jeste doplnim: nespolehejte na tohle. Je to tvar SQL __PRED__ expanzi a escapovanim promennych, casto to ani neni validni SQL. Pokud chcete 100% jistotu, pouzijte query log ve vasi DB.

Limit False aura:43
6. 9. 2009 12:22 Nový

debug toolbar, performance

celé vlákno

Pro měření a inspekci skutečných dotazů je výborný django debug toolbar (http://github.com/…/tree/master), umí třeba zobrazit odkud z kódu queries lezou a další informace. Debug toolbar vyžaduje django >= 1.0.

Jinak pozor na fakt, že čas reportovaný djangem u query je skutečně jenom cena DB query a nepočítá se do toho overhead djanga, který může být klidně jednou tolik, viz následovní screenshot z kcachegrindu:

http://imgur.com/JMHSE.png

Taky šablonovací systém djanga rozhodně nepatří mezi nejrychlejší, i s překompilovanou šablonou to trvá celkem dlouho. Což se dá obejít cachováním a/nebo použitím jiného šablonovacího systému.

Jozef
Jozef (neregistrovaný) ---.84-47-54.t-com.sk
6. 9. 2009 17:58 Nový

Eager loading / N+1 query problem

celé vlákno

Zdravim,

zaujimalo by ma ako v django orm riesit eager loading, resp. N+1 query problem. select_related() pouzivam, ale potreboval by som to opacne. (Presiel som na django z Rails, kde to bola bezna vec). Vdaka :)

Jozef

Mintaka
Mintaka (neregistrovaný) 93.99.39.---
7. 9. 2009 2:47 Nový

Re: Eager loading / N+1 query problem

celé vlákno

RE opačně:
To jako že chceš zjistit, které záznamy v jedné tabulce mají foreign-key na nějakou hodnotu v druhé?

Navím jak to řeší Rails, ale předpokládám že na to pod kapotou používají některý z joinů.

Zkus mrknout sem http://www.djangoproject.com/…many_to_one/, třeba ti to pomůže.

goliash
goliash (neregistrovaný) ---.149.100.141.adsl.nextra.cz
7. 9. 2009 13:49 Nový

order_by syntax

celé vlákno

Diky za clanok, mam otazku:
>>> Store.objects­.exclude(city=‚Brno‘)­.filter(id__gt=0, id__lt=10).or­der_by(‚-city‘)

specificky mi nie je jasne:order_by(‚-city‘)

Preco je tam znamienko ‚-‘ ? Videl som to uz aj v off. dokumentacii/tu­torialoch,
ale nikde som nenasiel vysvetlenie preco to znamienko tam je ?

Diky

Pavel Dvořák
7. 9. 2009 13:52 Nový

Re: order_by syntax

celé vlákno

„Když potřebujeme položky seřadit obráceně, napíšeme znak mínus před název atributu.“

Tedy jedná se o řazení sestupně, ne vzestupně (od největšího po nejmenší, ne naopak).

goliash
goliash (neregistrovaný) ---.149.100.141.adsl.nextra.cz
7. 9. 2009 13:58 Nový

Re: order_by syntax

celé vlákno

Som idiot, ta poznamka v clanku mi fakt unikla.
Diky a prajem hodne zdaru pri dalsich castiach serialu.

Zasílat nově přidané příspěvky e-mailem