Giter Site home page Giter Site logo

bazaregat's People

Contributors

juremb avatar mpuh avatar nocmatic avatar zalazni avatar

Watchers

 avatar  avatar

Forkers

nocmatic

bazaregat's Issues

ER diagram

Pregledala sem vaš ER diagram in imam nekaj vprašanj oziroma pripomb:

  • Nisem čisto prepričana, kaj pomeni atribut kriterijska entitete regata, vendar pa se mi po poimenovanju atributa zdi, da bi to morda moral biti boolean, torej podatkovni tip, ki zavzame vrednost true ali false?
  • Zakaj ima regata natanko en klub - boste imeli v bazi shranjene le takšne regate, na kateri sodeluje natanko en klub? Ali je relacija med klubom in regato potrebna - ali lahko popolni podatek o tem, kateri klub(i) je(so) sodeloval(i) na regati, dobimo iz članstva tekmovalcev, ki so sodelovali na regati (odvisno je tudi od vaših podatkov)?

Mimogrede bi pripomnila še, da na repozitorij ne sodi celotna vsebina folderja .idea, saj so nekatere datoteke znotraj tega folderja user-specific (ali kako drugače nepomembne / nepotrebne / sensitive). Uradni .gitignore podjetja JetBrains, katerih IDEji shranjujejo nastavitve v folder .idea, se nahaja tukaj, sodeč po temu na vaš repozitorij ne sodi vsaj .idea/workspace.xml. Ponavadi pa se pri projektih poignorira kar celotno vsebino tega folderja.

Ogromen commit

Vidim, da je v zadnjem commitu (059630d) na repozitorij šlo celotno virtualno okolje, kar pa seveda tja ne sodi. Da bi ga @zalazni (ali morda @nocmatic?) pobrisala iz repozitorija, ne da bi pobrisala virtualno okolje pri sebi, bo najlažje doseči iz ukazne vrstice (npr. Git Bash) - postaviti se bo treba v vrhnjo mapo repozitorija:

git rm -r --cached flask/zalaenv/

Da okolje ne bo šlo spet na repozitorij, bo treba dodati še ustrezno vrstico v .gitignore, npr. flask/zalaenv.

Če @JureMB in @mpuh tega commita še nimata pri sebi, bo morda najlažje, da se zadnji commit nadomesti z novim, ki ne vsebuje neželenih datotek (tega se načeloma ne počne, v takih primerih pa pride prav tudi ta možnost). Potem lahko @zalazni narediš

git add .gitignore
git commit --amend --no-edit    # zadnji commit nadomesti z novim
git push -f                     # "force push" - commit na vrhu se zamenja z novim, tudi če ne gre za njegovo nadaljevanje

Kdor commita 059630d nima pri sebi, lahko potem normalno naredi pull, kot da tega commita nikoli ni bilo. Če pa ga kdo že ima pri sebi in bi se ga rad znebil, lahko naredi

git reset 0bb2397        # commit pred tem
rm -rf flask/zalaenv/    # pobrišemo neželeno
git pull

Če ni bilo lokalnih sprememb, bo pull uspel. V nasprotnem primeru bo treba narediti še commit, da bo lahko pri pullu prišlo do združitve.

Dostop do baze, nevarne poizvedbe

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.

SQL koda za ustvarjanje tabel in uvoz podatkov

Opazila sem, da imate kodo za uvoz podatkov na repozitoriju v obliki sheeta s končnico xlsx (kar je malo čudno), medtem ko nikjer ne zasledim kode za ustvarjanje tabel. Prosim, da na repozitorij dodate tudi kodo za ustvarjanje tabel (lahko tudi kar v obliki, kot imate SQL_poizvedbe.txt).

Bi pa glede samega uvoza podatkov svetovala, da se naredi s Python skripto in ne na roke, kot imate trenutno (na bazo se laho povežete s pomočjo knjižnice, npr. MySQL Connector/Python, ki je narejena s strani podjetja, ki je razvilo MySQL).
S Python skripto preberete podatke iz CSV (npr. tekmovalce), iterirate čez tekmovalce in vsakega dodate v bazo.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.