0Pricing
Go Academy · Lektion

Zeilen abfragen

Ergebnismengen lesen

Zeilen abfragen ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.

Ergebnismengen abfragen

Verwenden Sie Query für Anweisungen, die Zeilen zurückgeben, etwa SELECT. Die Methode gibt ein *sql.Rows zurück, über das Sie iterieren. Für einen einzelnen Wert ist QueryRow einfacher.

db.Query

Query sendet das SQL und gibt Zeilen sowie einen Fehler zurück. Prüfen Sie den Fehler immer, bevor Sie die Zeilen verwenden.

rows, err := db.Query("SELECT id, name FROM users WHERE active = $1", true)
if err != nil {
    log.Fatal(err)
}

Immer rows.Close() per defer aufrufen

Die Zeilen halten eine Datenbankverbindung, bis sie geschlossen werden. defer rows.Close() gibt sie an den Pool zurück. Wenn Sie dies vergessen, gehen unter Last Verbindungen verloren.

defer rows.Close()

Mit rows.Next iterieren

rows.Next() wechselt zur nächsten Zeile und gibt false zurück, wenn keine weitere vorhanden ist. Innerhalb der Schleife rufen Sie Scan auf, um Spaltenwerte in Variablen zu kopieren.

for rows.Next() {
    var id int
    var name string
    if err := rows.Scan(&id, &name); err != nil {
        log.Fatal(err)
    }
    fmt.Println(id, name)
}

Scan erwartet Zeiger

Scan schreibt in die übergebenen Variablen. Daher müssen Sie Zeiger übergeben (&id, &name). Anzahl und Reihenfolge der Zeiger müssen mit den ausgewählten Spalten übereinstimmen.

rows.Err prüfen

Die Schleife kann enden, weil keine Daten mehr vorhanden sind oder weil während der Iteration ein Fehler aufgetreten ist. Rufen Sie nach der Schleife rows.Err() auf, um einen solchen Fehler zu erkennen.

if err := rows.Err(); err != nil {
    log.Fatal(err)
}

QueryRow für eine Zeile

Wenn Sie genau eine Zeile erwarten, sind QueryRow und Scan übersichtlicher. Wenn keine Zeile übereinstimmt, gibt Scan sql.ErrNoRows zurück.

var name string
err := db.QueryRow("SELECT name FROM users WHERE id = $1", 7).Scan(&name)
if err == sql.ErrNoRows {
    fmt.Println("not found")
}

Eine ausführbare Scan-Simulation

Für echte Abfragen wird eine Datenbank benötigt. Daher bildet dieses ausführbare Beispiel den Ablauf aus Query, Next und Scan über einem In-Memory-Slice ab, um das Iterationsmuster zu zeigen.

package main

import "fmt"

type Row struct {
    ID   int
    Name string
}

func main() {
    rows := []Row{{1, "Ada"}, {2, "Lin"}, {3, "Guido"}}
    for i := 0; i < len(rows); i++ {
        var id int
        var name string
        id = rows[i].ID
        name = rows[i].Name
        fmt.Printf("id=%d name=%s\n", id, name)
    }
    fmt.Println("scanned", len(rows), "rows")
}

NULL-Werte behandeln

Eine NULL-Spalte kann nicht in einen einfachen String oder int gescannt werden. Verwenden Sie sql.NullString, sql.NullInt64 oder einen Zeigertyp, damit der Code NULL von einem leeren Wert unterscheiden kann.

var email sql.NullString
rows.Scan(&email)
if email.Valid {
    fmt.Println(email.String)
}

In Structs scannen

Die Standardbibliothek scannt in einzelne Variablen, nicht in vollständige Structs. Ordnen Sie Spalten den Struct-Feldern zu, indem Sie &u.ID, &u.Name übergeben. Bibliotheken wie sqlx automatisieren dies.

SELECT * vermeiden

Listen Sie Spalten ausdrücklich auf, damit die Reihenfolge für Scan stabil bleibt. Eine Schemaänderung, die eine Spalte hinzufügt, führt bei einem positionsbasierten Scan unbemerkt zu Fehlern, wenn Sie sich auf SELECT * verlassen haben.

Kurztest

Testen Sie Ihr Wissen über Abfragen.

Zusammenfassung

Sie haben gelernt, Zeilen abzufragen:

  • Query gibt *sql.Rows zurück; rows.Close() per defer aufrufen
  • Mit rows.Next iterieren und die Werte per Scan in Zeiger kopieren
  • Nach der Schleife rows.Err() prüfen
  • QueryRow für einzelne Zeilen; sql.ErrNoRows bei keinem Treffer
  • Für nullable Spalten Null-Typen verwenden

Häufig gestellte Fragen

Ist die Lektion „Zeilen abfragen“ kostenlos?

Ja — der vollständige Text von „Zeilen abfragen“ 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 „Zeilen abfragen“?

Ergebnismengen lesen 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 2 von 4.

Wie lange dauert die Lektion „Zeilen abfragen“?

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