Go met database/sql

Go heeft databasewerk in de standaardbibliotheek (database/sql). Je voegt er één driver aan toe: go-sql-driver/mysql.

Installeren

bash
go get github.com/go-sql-driver/mysql

Verbinding maken

Bouw de DSN (data source name) uit de omgevingsvariabelen:

go
package main

import (
    "database/sql"
    "fmt"
    "os"

    _ "github.com/go-sql-driver/mysql"
)

func openDB() (*sql.DB, error) {
    dsn := fmt.Sprintf(
        "%s:%s@tcp(%s:%s)/%s?parseTime=true&charset=utf8mb4",
        os.Getenv("DB_USER"),
        os.Getenv("DB_PASS"),
        os.Getenv("DB_HOST"),
        os.Getenv("DB_PORT"),
        os.Getenv("DB_NAME"),
    )
    return sql.Open("mysql", dsn)
}
sql.Open opent nog niets
sql.Open controleert alleen de DSN. Roep db.Ping() aan om de verbinding echt te testen.

Data ophalen

go
rows, err := db.Query("SELECT id, naam, prijs FROM producten")
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

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

Invoegen met parameters

Gebruik ?-placeholders; geef de waardes als losse argumenten mee.

go
res, err := db.Exec(
    "INSERT INTO producten (naam, prijs) VALUES (?, ?)",
    naam, prijs,
)
if err != nil {
    log.Fatal(err)
}
nieuwID, _ := res.LastInsertId()

Eén rij ophalen

go
var naam string
err := db.QueryRow("SELECT naam FROM producten WHERE id = ?", id).Scan(&naam)
if err == sql.ErrNoRows {
    // niet gevonden
}
Altijd placeholders
Bouw queries nooit met fmt.Sprintf("... WHERE id = %d", id). Gebruik ?. Zie Veiligheid.