Tema
/
Interneto svetainių serverio dalies kūrimas GO
📖 Teorija

Namų darbas — įrodyk, kad schema nesiskiria

Įrodyk „jokio prasilenkimo" teiginį pats. Būtent šis namų darbas įtvirtina pamoką.

  1. Pridėk stulpelį nauja migracija. Migracijos yra papildomos-tik — pritaikytos neredaguoji, pridedi sekančią. Sukurk db/migrations/00002_user_name.sql:

    -- +goose Up
    ALTER TABLE users ADD COLUMN full_name TEXT NOT NULL DEFAULT '';
    -- +goose Down
    ALTER TABLE users DROP COLUMN full_name;
    
  2. Generuok iš naujo — ir neliesk Go.

    sqlc generate
    

    Atsidaryk internal/db/models.go. User struktūra pati užsiaugino FullName string lauką — nes sqlc perskaitė schemą iš naujo (dabar dvi migracijos), o struktūra yra jos funkcija. Ranka pakeitei nulį Go.

  3. Dabar pajusk, kaip prasilenkimo apsauga sukanda. Parašyk užklausą, atrenkančią naują stulpelį — -- name: GetUserName :one\nSELECT full_name FROM users WHERE id = $1; — tada parašyk su klaida kaip full_name. Paleisk sqlc generate:

    error: column "full_name" does not exist
    

    Klaida pagaunama generavimo metu, prieš tikrą schemą — ne vykdymo metu, produkcijoje, per vartotojo užklausą. Štai visas pažadas, pademonstruotas: generuotas kodas negali aprašyti lentelės, kurios nėra. Pataisyk klaidą, sugeneruok iš naujo — ir švaru.

  4. Perkrauk ir migruok iš naujo. go run ./cmd/signflow — log rodo pritaikomą OK 00002_user_name.sql. Tavo gyva bazė dabar turi stulpelį; šviežias diegimas pritaikytų abi migracijas nuo nulio.

Kur einam toliau. Turi users lentelę su password_hash stulpeliu, kurio kol kas niekas neužpildo. 4 pamoka pradeda autentifikacijos fazę: registracija su bcrypt slaptažodžių maišymu ir serverio pusės sesijos — sesijos eilutė Postgres, neskaitomas ID HttpOnly slapuke. Tai pirmas kartas, kai SignFlow žino, kas tu esi — ir atsakymo į klausimą, kurį Pica mobilioji programa atsakė kitaip, pradžia: sesijos, ne JWT. 14 pamoka ir yra visas argumentas, kodėl.