Otwieranie połączenia
Połącz się z bazą danych
Otwieranie połączenia to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 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.
Pakiet database/sql
Standardowy pakiet Go database/sql udostępnia ogólny interfejs niezależny od konkretnej bazy danych. Należy połączyć go ze sterownikiem odpowiedniej bazy, takiej jak PostgreSQL lub MySQL.
- Jeden interfejs dla wielu baz danych
- Wbudowane zarządzanie pulą połączeń
- Bezpieczne zapytania z parametrami
Importowanie sterownika
Sterownik rejestruje się za pomocą pustego importu. Podkreślnik oznacza, że importuje się go wyłącznie ze względu na efekt uboczny, czyli rejestrację, a nie po to, aby wywoływać go bezpośrednio.
import (
"database/sql"
_ "github.com/lib/pq"
)sql.Open
sql.Open przyjmuje nazwę sterownika oraz nazwę źródła danych (DSN). Nie nawiązuje jeszcze połączenia — jedynie przygotowuje pulę.
db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil {
log.Fatal(err)
}db jest pulą
Zwrócony obiekt *sql.DB nie jest pojedynczym połączeniem, lecz pulą połączeń bezpieczną do współbieżnego użycia przez wiele goroutines. Należy otworzyć ją raz i współdzielić w całej aplikacji.
Weryfikacja za pomocą Ping
Ponieważ Open działa leniwie, należy użyć Ping, aby rzeczywiście nawiązać połączenie oraz potwierdzić dostępność bazy danych i poprawność danych uwierzytelniających.
if err := db.Ping(); err != nil {
log.Fatal("cannot reach db:", err)
}Zamykanie puli
W funkcji main lub funkcji konfigurującej należy odroczyć wywołanie db.Close(). Puli prawie nigdy nie zamyka się po każdym zapytaniu, lecz dopiero podczas zamykania całej aplikacji.
defer db.Close()Dostrajanie puli
Pulą można zarządzać za pomocą SetMaxOpenConns, SetMaxIdleConns i SetConnMaxLifetime. Ustawienia te zapobiegają wyczerpaniu zasobów bazy danych i wymieniają nieaktualne połączenia.
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)Uruchamialny przykład w pamięci
Prawdziwe sterowniki wymagają sieciowej bazy danych, dlatego ten uruchamialny przykład pokazuje ten sam cykl życia z symulowanym otwarciem i pingiem, wykorzystując wyłącznie typy biblioteki standardowej.
package main
import (
"errors"
"fmt"
)
type DB struct{ dsn string }
func Open(driver, dsn string) (*DB, error) {
if dsn == "" {
return nil, errors.New("empty dsn")
}
return &DB{dsn: dsn}, nil
}
func (db *DB) Ping() error { return nil }
func (db *DB) Close() error { return nil }
func main() {
db, err := Open("postgres", "postgres://localhost/mydb")
if err != nil {
fmt.Println("open error:", err)
return
}
defer db.Close()
if err := db.Ping(); err != nil {
fmt.Println("ping error:", err)
return
}
fmt.Println("connected to", db.dsn)
}Warianty uwzględniające context
Należy preferować PingContext, QueryContext i ExecContext, aby wywołania respektowały terminy i anulowanie. Przekazanie context ogranicza czas, przez który zawieszone wywołanie bazy danych może blokować działanie.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
err := db.PingContext(ctx)Format DSN
Każdy sterownik definiuje własny format DSN. PostgreSQL akceptuje adres URL, a MySQL używa formatu user:pass@tcp(host:3306)/dbname. Należy zawsze sprawdzać dokumentację sterownika i unikać umieszczania danych uwierzytelniających na stałe w kodzie.
Jedna, długowieczna pula
Częstym błędem jest wywoływanie sql.Open przy każdym żądaniu. Niweczy to korzyści z puli i wyczerpuje pulę połączeń. Należy otworzyć ją raz podczas uruchamiania, zapisać obiekt *sql.DB i używać go ponownie w całej aplikacji.
Szybkie sprawdzenie
Sprawdź swoją wiedzę o połączeniach.
Podsumowanie
Poznali Państwo otwieranie połączenia:
- Należy zaimportować sterownik za pomocą pustego importu i wywołać sql.Open z nazwą sterownika oraz DSN
- *sql.DB to bezpieczna do współbieżnego użycia pula otwierana raz
- Ping weryfikuje rzeczywistą łączność
- Należy dostroić pulę i używać metod uwzględniających context
- Podczas zamykania aplikacji należy wykonać defer db.Close()
Często zadawane pytania
Czy lekcja „Otwieranie połączenia” jest bezpłatna?
Tak — pełny tekst „Otwieranie połączenia” 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 „Otwieranie połączenia”?
Połącz się z bazą danych Ć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 1 z 4.
Ile czasu zajmuje lekcja „Otwieranie połączenia”?
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