sqlc — užklausos iš schemos
Trys failai kaip skirtukai: sqlc.yaml → internal/db/queries/users.sql → internal/db/connect.go — konfigūracija, nukreipianti sqlc į tavo schemą, užklausa, kurią rašai, ir telkinys, ant kurio veikia generuotas kodas.
1. sqlc.yaml — viena eilutė, paverčianti visą „jokio prasilenkimo" pažadą tikru:
sql:
- engine: "postgresql"
schema: "db/migrations" # ← skaito TAVO goose migracijas
queries: "internal/db/queries"
gen:
go:
out: "internal/db"
sql_package: "pgx/v5"
schema: "db/migrations" — sqlc sužino users formą iš to paties migracijos failo, kurį vykdo goose. Nėra antro aprašo, kurį reikėtų sinchronizuoti.
2. internal/db/queries/users.sql — rašai SQL, anotuotą pavadinimu ir rezultato forma:
-- name: CountUsers :one
SELECT count(*) FROM users;
-- name: CountUsers :one sako sqlc: sugeneruok Go metodą CountUsers, grąžinantį vieną eilutę.
3. internal/db/connect.go — pgx jungčių telkinys, patikrintas su Ping, kad blogai sukonfigūruotas URL nulūžtų garsiai paleidimo metu, o ne per pirmą užklausą.
Sugeneruok Go. Dabar paleisk:
sqlc generate
sqlc perskaito schemą + užklausą ir įrašo internal/db/db.go, models.go ir users.sql.go — generuotą kodą, kurio neredaguoji (kaip Templ _templ.go). Gauni nemokamai ir pilnai su tipais:
// generuotame users.sql.go — tu parašei SQL, sqlc parašė šitą:
func (q *Queries) CountUsers(ctx context.Context) (int64, error) {
row := q.db.QueryRow(ctx, countUsers)
var count int64
err := row.Scan(&count)
return count, err
}
Ir User struktūrą models.go, kurios laukai tiksliai atkartoja stulpelius — id UUID, email TEXT, password_hash TEXT, created_at TIMESTAMPTZ — nes sqlc perskaitė juos iš tavo migracijos. Tu niekada nerašei tos struktūros ranka, ir ji niekada negali nesutapti su lentele.
Niekada neredaguok generuotų failų ranka.
db.go,models.go,users.sql.govisi turi antraštę// Code generated by sqlc. DO NOT EDIT.— ir tai rimta. Pakeitei SQL — paleisksqlc generateiš naujo. Generuotas kodas yra tavo schemos ir užklausų funkcija; redaguodamas jį ranka grąžini būtent tą prasilenkimą, kurį sqlc ir egzistuoja tam, kad neleistų.