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
- Otwieranie połączenia
- Wykonywanie zapytań dotyczących wierszy
- Przygotowane instrukcje
- Transakcje