Tema
/
Interneto svetainių serverio dalies kūrimas GO

sqlc — užklausos iš schemos

Trys failai kaip skirtukai: sqlc.yamlinternal/db/queries/users.sqlinternal/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.gogeneruotą 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.go visi turi antraštę // Code generated by sqlc. DO NOT EDIT. — ir tai rimta. Pakeitei SQL — paleisk sqlc generate iš 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ų.