ebSkola

10.1 Ievads datubāzēs un PostgreSQL

Stundas uzdevums: Saprast, kāpēc relāciju datubāzes ir labākas par CSV/JSON failiem, instalēt PostgreSQL un izveidot pirmo tabulu.

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

70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - izveido datubāzi un pieslēdzies · 2. uzdevums (~25 min) - uzraksti pirmo CREATE TABLE · 3. uzdevums (~20 min) - pārbaudi datu tipu ierobežojumus. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.

Pirms sāc: uzstādi PostgreSQL un atver pgAdmin vai psql. Ja instalēšana neizdodas, pasaki skolotājam - visu stundu var izpildīt arī uz kopīgā skolas servera.

Teorija: Kas ir relāciju datubāze?

Datubāze (DB) ir strukturēta datu kopa, kuru pārvalda datubāzes pārvaldības sistēma (DBVS). PostgreSQL ir bezmaksas, atvērtā koda DBVS, ko izmanto Apple, Reddit, Spotify un tūkstošiem citu lielo uzņēmumu.

Atšķirībā no JSON/CSV, datubāze:

  • Veic vaicājumus efektīvi - atrod 1 ierakstu no 1 miljona milisekundēs (indeksi).
  • Nodrošina datu integritāti - laukam ir tips, var aizliegt NULL, prasīt unikālas vērtības.
  • Atbalsta vairākus lietotājus vienlaicīgi - bez konfliktiem (transakcijas).
  • Saglabā datu attiecības - primārās un ārējās atslēgas.
-- Pirmā tabula
CREATE TABLE speletaji (
    id SERIAL PRIMARY KEY,    -- auto-increment unikāls ID
    vards TEXT NOT NULL,
    punkti INTEGER DEFAULT 0
);

Praktiskie uzdevumi

1. uzdevums -

Izveido datubāzi un pieslēdzies

Beigās tev būs sava datubāze, kurā strādāt visu tēmu.

  1. Atver pgAdmin vai izpildi terminālī psql -U postgres.
  2. Izpildi CREATE DATABASE spele;.
  3. Pieslēdzies tai ar \c spele vai izvēlies to pgAdmin sarakstā.
  4. Izpildi SELECT version();.
  5. Pieraksti, kāda PostgreSQL versija tev uzstādīta.
  6. Pieraksti, ar kādu lietotājvārdu tu pieslēdzies.

Gatavs, kad: SELECT version(); atgriež versijas tekstu, nevis kļūdu par pieslēgumu.

2. uzdevums -

Uzraksti pirmo CREATE TABLE

Beigās datubāzē būs tabula ar pareiziem datu tipiem.

  1. Izveido failu schema.sql.
  2. Ieraksti CREATE TABLE IF NOT EXISTS speletaji (.
  3. Pievieno lauku id SERIAL PRIMARY KEY.
  4. Pievieno lauku vards TEXT NOT NULL UNIQUE.
  5. Pievieno laukus punkti INTEGER DEFAULT 0 un izveidots TIMESTAMP DEFAULT NOW().
  6. Izpildi skriptu un pārbaudi tabulu ar \d speletaji.

Gatavs, kad: tabula speletaji eksistē un tajā ir visi četri lauki ar pareiziem tipiem.

3. uzdevums -

Pārbaudi datu tipu ierobežojumus

Beigās tu redzēsi, ka datubāze pati neļauj ievadīt sliktus datus.

  1. Ievadi vienu spēlētāju ar INSERT INTO speletaji (vards) VALUES ('Anna');.
  2. Izpildi to pašu komandu vēlreiz un izlasi kļūdu.
  3. Pieraksti, kurš ierobežojums to neļāva.
  4. Mēģini ievadīt spēlētāju bez vārda un pieraksti kļūdu.
  5. Mēģini ievadīt punktus kā tekstu 'daudz' un pieraksti kļūdu.
  6. Izpildi SELECT * FROM speletaji; un pārbaudi, cik rindu ir.
  7. Pieraksti vienu secinājumu: ar ko datubāze šeit ir labāka par CSV failu.

Gatavs, kad: datubāze noraidīja trīs nederīgus ierakstus, un tabulā ir tikai viena derīga rinda.

Papildu uzdevums - Pievieno CHECK ierobežojumu

Ja pamatdarbs ir gatavs, neļauj ievadīt negatīvus punktus.

  1. Izpildi ALTER TABLE speletaji ADD CONSTRAINT punkti_pozitivi CHECK (punkti >= 0);.
  2. Mēģini ievadīt spēlētāju ar punktiem -10.
  3. Pieraksti kļūdas nosaukumu.
  4. Ievadi spēlētāju ar punktiem 50 un pārbaudi, ka tas izdodas.
  5. Pieraksti, kāpēc šādu pārbaudi labāk likt datubāzē, nevis Python kodā.

Gatavs, kad: negatīvi punkti tiek noraidīti pašā datubāzē, arī tad, ja Python kods to nepārbauda.

Biežākās kļūdas

  • Aizmirsi paroli postgres lietotājam: Instalācijas laikā saglabā paroli pārvaldnieka rīkā (piem., Bitwarden).
  • Tabulu nevar dzēst: Vispirms ar DROP TABLE IF EXISTS speletaji CASCADE; - CASCADE noņem arī saistītos objektus.
  • SERIAL nepilda: Saglabā skripta failu un pārbaudi pareizrakstību (S-E-R-I-A-L).

Koda piemērs

-- Pirmais SQL skripts (schema.sql)
CREATE TABLE IF NOT EXISTS speletaji (
    id SERIAL PRIMARY KEY,
    vards TEXT NOT NULL UNIQUE,
    punkti INTEGER DEFAULT 0,
    izveidots TIMESTAMP DEFAULT NOW()
);

-- Pārbaude, ka tabula izveidota
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public';
table_name
----------
speletaji