Schema ir migracijos — users lentelė, įterpimas, config
Pirma — naujos priklausomybės:
go get github.com/jackc/pgx/v5 github.com/pressly/goose/v3 github.com/joho/godotenv
Trys failai kaip skirtukai, priklausomybių tvarka: 00001_users.sql → db/embed.go → config.go (schema, tada jos įterpimas, tada konfigūracijos supažindinimas, kur yra bazė). Paskutinis — tavo 1 pamokos config pakeitimas.
1. db/migrations/00001_users.sql — pirma migracija. -- +goose žymės nurodo goose, kur prasideda kiekviena kryptis:
-- +goose Up
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- +goose Down
DROP TABLE users;
Up sukuria, Down atšaukia. gen_random_uuid() (iš pgcrypto) kiekvienai eilutei duoda UUID pirminį raktą — jokių atspėjamų nuoseklių ID, o tai svarbu, kai dokumentai priklauso vartotojams. email yra UNIQUE; password_hash užpildomas 4 pamokoje.
2. db/embed.go — įkepk migracijas į dvejetainį:
//go:embed migrations/*.sql
var FS embed.FS
Būtent tai padaro diegimą savaime migruojantį: .sql failai keliauja dvejetainio viduje, o paleidimas įvykdo tuos, kurie dar nepritaikyti.
3. internal/config/config.go (modify) — konfigūracija sužino, kur yra bazė. Pokytis: DatabaseURL laukas, godotenv lokaliam .env skaityti ir produkcijos apsauga.
DatabaseURL: getenv("DATABASE_URL", "postgres://postgres@localhost:5432/signflow?sslmode=disable"),
Dev numatytoji reikšmė jungiasi prie lokalaus Postgres be slaptažodžio (trust auth), tad go run veikia be jokios konfigūracijos. Viskas iš 1 pamokos — Port, Env, BaseURL, IsProd — perkelta nepakitę; diff — tik naujas laukas ir .env skaitymas.
.envdev aplinkoje.godotenv.Load()skaito.envfailą, jei jis yra (ir nurimsta, jei ne), tadDATABASE_URLgali laikyti gitignore'intame.env, o ne eksportuoti kiekvienoje sesijoje. Produkcijoje tikrą aplinką nustato Railway.