You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Vidim, da v app.py uvažate podatke za prijavo iz auth.py (tega seveda ni v repozitoriju zaradi vnosa v .gitignore). Ker želite, da bo aplikacijo lahko uporabil kdorkoli, tam torej uvozite auth_public.py (glejte vzorec. Seveda bo potrebno nastaviti tudi ustrezne pravice - poglejte si pdurcik/Baza-clanstva-RDR#3. Vaše aplikacije tako nisem mogel preizkusiti.
Opažam še, da podatke v poizvedbe vstavljate z metodo format, kar pa lahko vodi do napadov SQLinjection. Da bodo poizvedbe varne, na mesto vsakega podatka postavite %s (brez morebitnih navednic!), podatke pa podajte v seznamu kot drugi element metode execute, npr.
cur.execute(""" SELECT sailno, tekmovalec.ime, spol, leto_rojstva, klub.ime AS ime_kluba FROM klub JOIN clanstvo ON klub.idklub = clanstvo.klub_idklub JOIN tekmovalec ON clanstvo.tekmovalec_idtekmovalec = tekmovalec.idtekmovalec WHERE sailno = %s""", [sailno])
Poleg tega naredite še nekonstantno število začasnih tabel, kar je v nasprotju s samo organizacijo podatkov - kolikor vidim, to počnete samo za potrebe izračuna točk. Začasno tabelo klubi_plovi imate lahko kot pogled (VIEW), izračuna točk se pa lahko lotite nekako tako.
Naredite pogled, ki za vsak plov pove število uvrščenih:
CREATEVIEWuvrsceni_plovASSELECT plov_idplov, count(tocke) AS uvrsceni
FROM tocke_plovi
GROUP BY plov_idplov
Naredite pogled, ki za vsakega tekmovalca na plovu vrne efektivne točke:
CREATEVIEWefektivne_tockeASSELECT tocke, posebnosti, COALESCE(tocke, uvrsceni+1) AS efektivne_tocke,
tekmovalec_idtekmovalec, plov_idplov
FROM tocke_plovi NATURAL JOIN uvrsceni_plov
Sedaj lahko izračunate končne in skupne točke vsakega tekmovalca na izbrani regati:
SELECT tekmovalec_idtekmovalec, sum(efektivne_tocke) -max(efektivne_tocke) AS net,
sum(efektivne_tocke) AS tot,
array_agg(coalesce(tocke::text, posebnosti) ORDER BY st_plova ASC) AS tocke_plovi
FROM efektivne_tocke JOIN plov ON plov_idplov =plov.idplovWHERE regata_idregata = %s
GROUP BY tekmovalec_idtekmovalec
ORDER BY net ASC, tot ASC,
array_agg(efektivne_tocke ORDER BY st_plova ASC) ASC, tocke_plovi ASC
Funkcija array_agg spravi podatke iz ene skupine v seznam - tako je mogoče leksikografsko urejati po točkah čez vse plove (pri ORDER BYarray_agg poskrbi za ustrezno ureditev številskih točk, tocke_plovi pa potem uredi še po posebnostih, kjer točke niso navedene). Tako boste v Pythonu direktno dobili seznam točk za vsak plov (to bodo nizi, tako da bodo primerni za prikaz, ne pa tudi nadaljnje računanje).
Seveda lahko z ustreznimi JOINi v isti poizvedbi pridobite še ostale podatke o tekmovalcih.
The text was updated successfully, but these errors were encountered:
jaanos
added a commit
to jaanos/OPB
that referenced
this issue
Jul 11, 2018
Vidim, da je to urejeno, vašo spletno aplikacijo pa sem testiral in lepo deluje. Edino, kar bi pripomnil, je to, da bi bilo lepše, če pri iskanju ne bi bilo potrbno vpisati celotnega imena jadralca, pač pa bi se pri nepopolnih (oziroma ne-enoličnih) vnosih prikazal seznam zadetkov.
Z @alenFMF ste se že domenili za termin zagovora. Če pa boste še kaj spreminjali, mi prosim javite, da posodobim povezavo na repozitoriju predmeta.
Vidim, da v
app.py
uvažate podatke za prijavo izauth.py
(tega seveda ni v repozitoriju zaradi vnosa v.gitignore
). Ker želite, da bo aplikacijo lahko uporabil kdorkoli, tam torej uvoziteauth_public.py
(glejte vzorec. Seveda bo potrebno nastaviti tudi ustrezne pravice - poglejte si pdurcik/Baza-clanstva-RDR#3. Vaše aplikacije tako nisem mogel preizkusiti.Opažam še, da podatke v poizvedbe vstavljate z metodo
format
, kar pa lahko vodi do napadov SQL injection. Da bodo poizvedbe varne, na mesto vsakega podatka postavite%s
(brez morebitnih navednic!), podatke pa podajte v seznamu kot drugi element metodeexecute
, npr.Poleg tega naredite še nekonstantno število začasnih tabel, kar je v nasprotju s samo organizacijo podatkov - kolikor vidim, to počnete samo za potrebe izračuna točk. Začasno tabelo
klubi_plovi
imate lahko kot pogled (VIEW
), izračuna točk se pa lahko lotite nekako tako.Funkcija
array_agg
spravi podatke iz ene skupine v seznam - tako je mogoče leksikografsko urejati po točkah čez vse plove (priORDER BY
array_agg
poskrbi za ustrezno ureditev številskih točk,tocke_plovi
pa potem uredi še po posebnostih, kjer točke niso navedene). Tako boste v Pythonu direktno dobili seznam točk za vsak plov (to bodo nizi, tako da bodo primerni za prikaz, ne pa tudi nadaljnje računanje).Seveda lahko z ustreznimi
JOIN
i v isti poizvedbi pridobite še ostale podatke o tekmovalcih.The text was updated successfully, but these errors were encountered: