Go met database/sql
Go heeft databasewerk in de standaardbibliotheek (database/sql). Je voegt er één driver aan toe: go-sql-driver/mysql.
Installeren
bashgo get github.com/go-sql-driver/mysql
Verbinding maken
Bouw de DSN (data source name) uit de omgevingsvariabelen:
gopackage 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
gorows, 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.
gores, err := db.Exec( "INSERT INTO producten (naam, prijs) VALUES (?, ?)", naam, prijs, ) if err != nil { log.Fatal(err) } nieuwID, _ := res.LastInsertId()
Eén rij ophalen
govar 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.