10.6 Noslēguma projekts: Highscore datubāze

Tavs šīs stundas izaicinājums: Apvienot visas tēmas prasmes — projektēt, izveidot un Python kodā lietot pilnvērtīgu datubāzi spēļu rezultātu glabāšanai un statistikai.

SR 2.4.17. Darbs ar failiem un ārējām datu krātuvēm SR 2.4.4. Iegūst, atlasa un apstrādā datus SR 2.4.5. Datu analīze un vizualizācija SR 2.4.15. Modulāras programmas un funkcijas

Teorija: Spēles apraksts un arhitektūra

Tavs uzdevums ir izveidot pilnvērtīgu "Highscore datubāzi" — Python lietotnes, kas:

Datu modelis (3 tabulas):

speletaji (id, vards, izveidots)
speles_veidi (id, nosaukums)
rezultati (id, speletajs_id, speles_veids_id, punkti, spelets)

1. uzdevums: Datubāzes shēma (1. līmenis)

Izveido visas tabulas ar attiecībām un ievāksim sākuma datus.

Izpildes soļi:

  1. Izveido failu schema.sql ar visām trim tabulām, PK, FK un CASCADE.
  2. Pievieno failu seed.sql ar 3 spēlēm ("Skaitļu minētājs", "Atmiņu spēle", "Quiz") un 5 spēlētājiem.
  3. Izveido Python failu db.py, kas savienojas un izpilda abus skriptus.
  4. Pārbaudi pgAdmin — visas tabulas un dati ir vietā.

2. uzdevums: Saglabāšanas un nolasīšanas funkcijas (2. līmenis)

Uzraksti moduli ar CRUD funkcijām.

Izpildes soļi:

  1. Funkcija saglabat_rezultatu(speletaja_vards, speles_nosaukums, punkti):
    (a) atrod vai izveido spēlētāju (INSERT ... ON CONFLICT DO NOTHING RETURNING id);
    (b) atrod spēles_veidu;
    (c) ievada rezultātu.
  2. Funkcija top_speletaji(speles_nosaukums=None, dienas=30) — atgriež TOP 10 ar filtru pēc spēles un datumu intervāla.
  3. Funkcija statistika(speletaja_vards) — atgriež vārdnīcu ar speles_skaits, kopa, videjie, rekords.
  4. Visas funkcijas testē galvenajā main.py failā.

3. uzdevums: CLI saskarne un eksports (3. līmenis)

Izveido komandrindas rīku un CSV eksportu.

Izpildes soļi:

  1. main.py izveido izvēlni ar 4 opcijām: 1) Pievienot rezultātu; 2) TOP 10; 3) Spēlētāja statistika; 4) Eksportēt CSV; 5) Iziet.
  2. Eksports: SELECT s.vards, sv.nosaukums, r.punkti, r.spelets FROM rezultati r JOIN ... rezultātus saglabā highscore_eksports.csv.
  3. Pievieno kļūdu apstrādi (try/except) tīkla un DB kļūdām.
  4. Sadali kodu moduļos: db.py, cli.py, main.py.
  5. GitHub: vismaz 5 commit ar skaidriem ziņojumiem un README ar palaišanas instrukciju.

Papildus uzdevums: Web saskarne ar Streamlit

Pievieno tīmekļa saskarni datu apskatei.

Izpildes soļi:

  1. pip install streamlit
  2. Izveido web.py ar st.title(), st.dataframe(top10), st.bar_chart() spēlētāju punktiem.
  3. Palaiž ar streamlit run web.py.

Biežākās kļūdas

Koda piemērs

-- Pilna shēma + 1 testa rezultāts
CREATE TABLE speletaji (
    id SERIAL PRIMARY KEY,
    vards TEXT NOT NULL UNIQUE
);

CREATE TABLE speles_veidi (
    id SERIAL PRIMARY KEY,
    nosaukums TEXT NOT NULL UNIQUE
);

CREATE TABLE rezultati (
    id SERIAL PRIMARY KEY,
    speletajs_id INTEGER REFERENCES speletaji(id) ON DELETE CASCADE,
    speles_veids_id INTEGER REFERENCES speles_veidi(id),
    punkti INTEGER NOT NULL CHECK (punkti >= 0),
    spelets TIMESTAMP DEFAULT NOW()
);

INSERT INTO speletaji (vards) VALUES ('Anna');
INSERT INTO speles_veidi (nosaukums) VALUES ('Skaitļu minētājs');
INSERT INTO rezultati (speletajs_id, speles_veids_id, punkti) VALUES (1, 1, 95);

SELECT s.vards, sv.nosaukums, r.punkti
FROM rezultati r
JOIN speletaji s ON s.id = r.speletajs_id
JOIN speles_veidi sv ON sv.id = r.speles_veids_id;
vards | nosaukums | punkti
------|-------------------|-------
Anna | Skaitļu minētājs | 95
⬅ Iepriekšējā stunda Tēmas apkopojums ➡