Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dostop do baze, nevarne poizvedbe #3

Closed
jaanos opened this issue Jul 4, 2018 · 1 comment
Closed

Dostop do baze, nevarne poizvedbe #3

jaanos opened this issue Jul 4, 2018 · 1 comment

Comments

@jaanos
Copy link

jaanos commented Jul 4, 2018

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 SQL injection. 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:
CREATE VIEW uvrsceni_plov AS
SELECT 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:
CREATE VIEW efektivne_tocke AS
SELECT 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.idplov
WHERE 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 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 JOINi v isti poizvedbi pridobite še ostale podatke o tekmovalcih.

jaanos added a commit to jaanos/OPB that referenced this issue Jul 11, 2018
@jaanos
Copy link
Author

jaanos commented 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.

@jaanos jaanos closed this as completed Jul 11, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant