0Pricing
Go Academy · Lekcja

Wykonywanie zapytań dotyczących wierszy

Odczytuj zestawy wyników

Wykonywanie zapytań dotyczących wierszy to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Pobieranie zestawów wyników

Należy używać Query dla instrukcji zwracających wiersze, takich jak SELECT. Zwraca ono obiekt *sql.Rows, po którym można iterować. W przypadku pojedynczej wartości prostszym rozwiązaniem jest QueryRow.

db.Query

Query wysyła SQL i zwraca wiersze oraz błąd. Przed użyciem wierszy należy zawsze sprawdzić błąd.

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

Zawsze odraczaj rows.Close()

Obiekt rows utrzymuje połączenie z bazą danych aż do zamknięcia. defer rows.Close() zwraca je do puli. Pominięcie tego wywołania powoduje wyciekanie połączeń przy dużym obciążeniu.

defer rows.Close()

Iterowanie za pomocą rows.Next

rows.Next() przechodzi do następnego wiersza i zwraca false po zakończeniu iteracji. Wewnątrz pętli należy wywołać Scan, aby skopiować wartości kolumn do zmiennych.

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 przyjmuje wskaźniki

Scan zapisuje dane do przekazanych zmiennych, dlatego należy przekazać wskaźniki (&id, &name). Liczba i kolejność wskaźników musi odpowiadać wybranym kolumnom.

Sprawdzanie rows.Err

Pętla może zakończyć się z powodu wyczerpania danych albo błędu, który wystąpił w trakcie iteracji. Po zakończeniu pętli należy wywołać rows.Err(), aby wykryć ewentualny błąd iteracji.

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

QueryRow dla jednego wiersza

Gdy oczekuje się dokładnie jednego wiersza, połączenie QueryRow z Scan jest prostszym rozwiązaniem. Jeśli żaden wiersz nie pasuje, Scan zwraca sql.ErrNoRows.

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

Uruchamialna symulacja Scan

Prawdziwe zapytania wymagają bazy danych, dlatego ten uruchamialny przykład odwzorowuje przepływ Query, Next i Scan na wycinku przechowywanym w pamięci, aby pokazać wzorzec iteracji.

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

Obsługa NULL

Kolumny NULL nie można skanować bezpośrednio do zwykłego stringa ani inta. Należy użyć sql.NullString, sql.NullInt64 lub typu wskaźnikowego, aby kod mógł odróżnić NULL od pustej wartości.

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

Skanowanie do struktur

Biblioteka standardowa skanuje dane do pojedynczych zmiennych, a nie do całych struktur. Kolumny mapuje się na pola struktury, przekazując &u.ID, &u.Name. Biblioteki takie jak sqlx automatyzują ten proces.

Unikaj SELECT *

Należy jawnie wymieniać kolumny, aby kolejność przekazywana do Scan była stabilna. Zmiana schematu polegająca na dodaniu kolumny po cichu zepsuje pozycyjne wywołanie Scan, jeśli użyto SELECT *.

Szybkie sprawdzenie

Sprawdź swoją wiedzę o wykonywaniu zapytań.

Podsumowanie

Poznali Państwo pobieranie wierszy:

  • Query zwraca *sql.Rows; należy wykonać defer rows.Close()
  • Należy iterować za pomocą rows.Next i kopiować dane przez Scan do wskaźników
  • Po zakończeniu pętli należy sprawdzić rows.Err()
  • QueryRow służy do pobierania pojedynczych wierszy; przy braku wyniku zwraca sql.ErrNoRows
  • Dla kolumn, które mogą zawierać NULL, należy używać typów Null

Często zadawane pytania

Czy lekcja „Wykonywanie zapytań dotyczących wierszy” jest bezpłatna?

Tak — pełny tekst „Wykonywanie zapytań dotyczących wierszy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wykonywanie zapytań dotyczących wierszy”?

Odczytuj zestawy wyników Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Wykonywanie zapytań dotyczących wierszy”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Otwieranie połączenia
  2. Wykonywanie zapytań dotyczących wierszy
  3. Przygotowane instrukcje
  4. Transakcje
← Powrót do Go Academy