sqlc für Go: Type-sicheren Code aus SQL generieren
sqlc ist ein Compiler, der auf Basis Ihrer SQL-Abfragen Go-Code generiert. Anstatt manuell Funktionen für die Datenbankarbeit zu schreiben, formulieren Sie reines SQL, und sqlc erstellt für Sie typisierte, sichere und performante Funktionen. Dies ist ein grundlegend anderer Ansatz im Vergleich zu ORMs: Sie behalten die volle Kontrolle über SQL, während Sie sich von der lästigen Boilerplate-Code-Erstellung befreien.
Warum ist das sinnvoll? Erstens garantiert sqlc Type-Safety auf Compiler-Ebene. Wenn Sie das Tabellenschema oder eine Abfrage ändern, generiert sqlc den Code neu, und der Go-Compiler zeigt sofort alle Stellen an, die angepasst werden müssen. Zweitens die Performance: Der generierte Code verwendet keine Reflection und führt keine überflüssigen Allokationen durch, was ihn nahezu so schnell macht wie manuell geschriebene Abfragen mit database/sql. Drittens vereinfacht es Code-Reviews: SQL-Abfragen sind in .sql-Dateien klar sichtbar und nicht in ORM-Methoden versteckt.
sqlc eignet sich ideal für Projekte, bei denen Performance und Kontrolle über Abfragen wichtig sind: hochlastige APIs, Finanzsysteme, Analyseplattformen. Es lässt sich hervorragend mit Migrationen (z. B. golang-migrate) kombinieren und bindet Sie nicht an ein bestimmtes DBMS – unterstützt werden PostgreSQL, MySQL und SQLite.
Installation
sqlc ist keine Bibliothek, sondern ein Kommandozeilen-Tool. Sie können es auf verschiedene Weise installieren:
# Über go install (empfohlen)
go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest
# Über Homebrew (macOS/Linux)
brew install sqlc
# Binärdatei von GitHub herunterladen
# https://github.com/sqlc-dev/sqlc/releases
Überprüfen Sie nach der Installation die Version:
sqlc version
Schnellstart
Erstellen wir ein minimales Projekt, das die Funktionsweise von sqlc demonstriert.
1. Projektstruktur
mkdir sqlc-demo && cd sqlc-demo
go mod init sqlc-demo
2. sqlc-Konfiguration
Erstellen Sie die Datei sqlc.yaml im Projektverzeichnis:
version: "2"
sql:
- engine: "postgresql"
queries: "queries.sql"
schema: "schema.sql"
gen:
go:
package: "db"
out: "db"
sql_package: "pgx/v5"
3. Datenbankschema
Datei schema.sql:
CREATE TABLE authors (
id BIGSERIAL PRIMARY KEY,
name text NOT NULL,
bio text
);
4. SQL-Abfragen
Datei queries.sql:
-- name: GetAuthor :one
SELECT * FROM authors
WHERE id = $1;
-- name: ListAuthors :many
SELECT * FROM authors
ORDER BY name;
-- name: CreateAuthor :one
INSERT INTO authors (name, bio)
VALUES ($1, $2)
RETURNING *;
-- name: DeleteAuthor :exec
DELETE FROM authors
WHERE id = $1;
5. Code-Generierung
sqlc generate
Nach der Ausführung erscheinen die generierten Dateien im Ordner db/. Jetzt können Sie sie im Code verwenden:
package main
import (
"context"
"fmt"
"log"
"github.com/jackc/pgx/v5/pgxpool"
"sqlc-demo/db"
)
func main() {
ctx := context.Background()
pool, err := pgxpool.New(ctx, "postgres://user:pass@localhost:5432/testdb")
if err != nil {
log.Fatal(err)
}
defer pool.Close()
queries := db.New(pool)
// Autor erstellen
author, err := queries.CreateAuthor(ctx, db.CreateAuthorParams{
Name: "Brian Kernighan",
Bio: "Co-author of The C Programming Language",
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Autor erstellt: %+v\n", author)
// Autor per ID abrufen
fetched, err := queries.GetAuthor(ctx, author.ID)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Autor abgerufen: %+v\n", fetched)
}