sqlc für Go: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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)
}

Empfehlungen