Go Academy · Oppitunti

database/sql ja ajurit

Tietokannan määritys, QueryRow, Scan ja yhteyspoolit

Oppitunti 1/413 vaihetta

database/sql ja ajurit on ilmainen Go Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Go Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Go Academy-kurssilla on yhteensä 4 oppituntia.

database/sql:n yleiskatsaus

database/sql on Gon standardoitu tietokantojen abstraktiokerros. Se hallitsee yhteyspoolia ja toimii minkä tahansa tietokannan kanssa ajurilaajennuksen avulla.

Ajurin rekisteröiminen

Tuokaa ajuripaketti sen sivuvaikutusten eli ajurin rekisteröinnin vuoksi. Avatkaa sitten yhteys:

import _ "github.com/lib/pq" // PostgreSQL driver

db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil { log.Fatal(err) }
defer db.Close()

sql.Open ja db.Ping

sql.Open ei muodosta yhteyttä, vaan tarkistaa DSN:n. Kutsukaa db.Ping()- tai db.PingContext(ctx)-funktiota varmistaaksenne, että yhteys on käytettävissä.

if err := db.Ping(); err != nil { log.Fatal(err) }

Rivien kysely

Käyttäkää db.QueryContext-funktiota SELECT-kyselyn suorittamiseen ja rivien lukemiseen:

rows, err := db.QueryContext(ctx, "SELECT id, name FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()
for rows.Next() {
    var id int; var name string
    rows.Scan(&id, &name)
}

Yhden rivin kysely

db.QueryRowContext palauttaa *Row-arvon kyselyille, joiden odotetaan palauttavan enintään yhden tuloksen:

var name string
err := db.QueryRowContext(ctx, "SELECT name FROM users WHERE id = $1", id).Scan(&name)
if errors.Is(err, sql.ErrNoRows) { /* not found */ }

Muutosoperaatioiden suorittaminen

Käyttäkää db.ExecContext-funktiota INSERT-, UPDATE- ja DELETE-kyselyihin. Se palauttaa Result-arvon, joka sisältää muutettujen rivien määrän ja viimeksi lisätyn tunnuksen.

result, err := db.ExecContext(ctx, "INSERT INTO users(name) VALUES($1)", name)
if err != nil { return err }
id, _ := result.LastInsertId()

Valmistellut lauseet

Valmistelkaa lause kerran ja suorittakaa se tehokkaasti useita kertoja:

stmt, err := db.PrepareContext(ctx, "SELECT id FROM users WHERE email = $1")
defer stmt.Close()
for _, email := range emails {
    row := stmt.QueryRowContext(ctx, email)
}

Yhteyspoolin asetukset

Määrittäkää poolin asetukset tuotantokäyttöä varten:

db.SetMaxOpenConns(25)
db.SetMaxIdleConns(25)
db.SetConnMaxLifetime(5 * time.Minute)

rows.Err()-virheen tarkistaminen

Tarkistakaa rivien käsittelysilmukan jälkeen aina rows.Err() — silmukka on voinut päättyä ennenaikaisesti verkkovirheen vuoksi.

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

NULL-arvot

Käyttäkää sql.NullString-, sql.NullInt64- ja muita vastaavia tyyppejä tietokannan NULL-arvojen käsittelyyn. Muuten skannaus suoraan ei-osoitintyyppiseen Go-tyyppiin voi aiheuttaa paniikin.

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

Ajuriluettelo

Suosittuja ajureita ovat github.com/lib/pq (PostgreSQL), github.com/go-sql-driver/mysql (MySQL) ja modernc.org/sqlite (SQLite, puhdas Go).

Pikatarkistus

Miksi rows.Close() on aina kutsuttava ja rows.Err() tarkistettava kyselyn jälkeen?

Kertaus: database/sql

Tärkeimmät kohdat:

  • Tuokaa ajuri alaviivalla _ sivuvaikutusten vuoksi; käyttäkää sql.Open-funktiota ja Pingiä
  • QueryContext → rows.Next + Scan + rows.Close + rows.Err
  • Käyttäkää ExecContext-funktiota muutosoperaatioihin ja QueryRowContext-funktiota yksittäisille riveille
  • Määrittäkää poolin asetukset SetMaxOpenConns-, SetMaxIdleConns- ja SetConnMaxLifetime-funktioilla
Aloita maksutta

Opi Go tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”database/sql ja ajurit” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Go Academy-oppimispolun 3 oppituntia, myös oppitunnin “database/sql ja ajurit”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Go Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”database/sql ja ajurit”?

Tietokannan määritys, QueryRow, Scan ja yhteyspoolit Harjoittelet Go Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Go Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Go Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”database/sql ja ajurit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Go Academy-oppitunnilla?

Kyllä. Jokainen Go Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. database/sql ja ajurit
  2. sqlx: struct-skannaus ja nimetyt kyselyt
  3. pgx: tehokas PostgreSQL-ajuri
  4. Transaktiot ja migraatiot
← Takaisin: Go Academy