0Pricing
Go Academy · Lektion

Prepared Statements

Parametrisierte Abfragen ausführen

Prepared Statements ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine vorbereitete Anweisung

Eine vorbereitete Anweisung sendet den SQL-Text einmal an die Datenbank, damit er geparst und geplant wird, und führt ihn anschließend mit unterschiedlichen Parametern mehrfach aus. Bei wiederholten Abfragen ist sie schneller und schützt besser vor Injection.

Parameterplatzhalter

Erstellen Sie SQL niemals durch Verkettung von Benutzereingaben. Verwenden Sie Platzhalter, damit der Treiber die Werte getrennt sendet. PostgreSQL verwendet $1, $2, MySQL und SQLite verwenden ?.

SELECT * FROM users WHERE age > $1 AND city = $2

Warum dies Injection verhindert

Da die Parameter getrennt vom SQL-Text übertragen werden, behandelt die Datenbank sie strikt als Daten und niemals als Code. Ein schädlicher Wert wie " OR 1=1 wird zu einer literalen Zeichenkette und nicht zu ausführbarem SQL.

db.Prepare

Prepare gibt einen an den Pool gebundenen *sql.Stmt zurück. Anschließend rufen Sie Exec oder Query für die Anweisung mit Argumenten auf.

stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES($1, $2)")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()

Die Anweisung ausführen

Rufen Sie stmt.Exec mit Argumenten für jeden Platzhalter auf. Bei Inserts und Updates gibt Exec ein sql.Result mit der Anzahl betroffener Zeilen und der ID des letzten Inserts zurück.

res, err := stmt.Exec("Ada", 36)
if err != nil {
    log.Fatal(err)
}
n, _ := res.RowsAffected()
fmt.Println("inserted", n)

In einer Schleife wiederverwenden

Der Vorteil entsteht durch Wiederverwendung: einmal vorbereiten und innerhalb einer Schleife mehrfach ausführen. Die Datenbank verwendet ihren geparsten Ausführungsplan für jeden Aufruf wieder.

for _, u := range users {
    if _, err := stmt.Exec(u.Name, u.Age); err != nil {
        log.Fatal(err)
    }
}

Implizite Vorbereitung

Wenn Sie Argumente direkt an db.Query oder db.Exec übergeben, werden Platzhalter ebenfalls sicher verwendet; der Treiber bereitet die Anweisung möglicherweise intern vor. Ein explizites Prepare ist vor allem bei wiederholter Ausführung relevant.

Eine ausführbare Simulation der Parameterbindung

Für echte vorbereitete Statements wird eine Datenbank benötigt. Dieses ausführbare Beispiel simuliert eine sichere Parameterbindung und zeigt, wie Werte vom Abfragetext getrennt bleiben.

package main

import "fmt"

func execPrepared(query string, args ...interface{}) string {
    return fmt.Sprintf("EXEC %q with args %v", query, args)
}

func main() {
    q := "INSERT INTO users(name, age) VALUES($1, $2)"
    people := [][2]interface{}{{"Ada", 36}, {"Lin", 41}}
    for _, p := range people {
        fmt.Println(execPrepared(q, p[0], p[1]))
    }
}

Kontextvarianten

Verwenden Sie PrepareContext und stmt.ExecContext, damit vorbereitete Aufrufe Zeitüberschreitungen und Abbrüche berücksichtigen – genau wie der restliche Teil von database/sql.

Stmt immer schließen

Ein *sql.Stmt hält Ressourcen in der Datenbank. Stellen Sie stmt.Close() zurück, sobald Sie fertig sind, zum Beispiel mit defer. Nicht freigegebene Statements können die serverseitigen Limits für vorbereitete Statements ausschöpfen.

Statements und Pooling

Ein auf *sql.DB vorbereitetes Statement funktioniert über mehrere Poolverbindungen hinweg. Die Bibliothek bereitet es auf der jeweiligen Verbindung erneut vor, auf der es verwendet wird. Normalerweise müssen Sie das nicht selbst verwalten.

Kurzer Test

Testen Sie Ihr Wissen über vorbereitete Statements.

Zusammenfassung

Sie haben vorbereitete Statements kennengelernt:

  • Prepare analysiert einmal, kann aber viele Male ausgeführt werden
  • Platzhalter ($1 oder ?) behandeln Werte als Daten und verhindern dadurch Injection
  • stmt.Exec gibt die Anzahl der betroffenen Zeilen zurück; verwenden Sie defer stmt.Close()
  • Verwenden Sie Statements in Schleifen wieder und für Zeitlimits die Kontextvarianten

Häufig gestellte Fragen

Ist die Lektion „Prepared Statements“ kostenlos?

Ja — der vollständige Text von „Prepared Statements“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Prepared Statements“?

Parametrisierte Abfragen ausführen Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Prepared Statements“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Eine Verbindung öffnen
  2. Zeilen abfragen
  3. Prepared Statements
  4. Transaktionen
← Zurück zu Go Academy