Go 透過 github.com/go-sql-driver/mysql 驅動連接 MySQL,支援 database/sql 標準介面。本文從 Ubuntu 環境建置、資料庫準備、驅動安裝到完整 CRUD 範例。
# 1. 安裝 MySQL Server sudo apt-get update && sudo apt-get install mysql-server # 記住 root 密碼 (如 root123) # 2. 建立資料庫與使用者 mysql -u root -p CREATE DATABASE people; GRANT ALL PRIVILEGES ON people.* TO 'peo'@'localhost' IDENTIFIED BY 'peo123'; GRANT ALL PRIVILEGES ON people.* TO 'peo'@'%' IDENTIFIED BY 'peo123'; -- 遠程 FLUSH PRIVILEGES; EXIT; # 3. 開放遠程訪問 (編輯 my.cnf) sudo nano /etc/mysql/my.cnf # bind-address = 127.0.0.1 → bind-address = 0.0.0.0 sudo systemctl restart mysql # 4. 建表測試資料 mysql -u peo -p USE people; CREATE TABLE hello (age INT, name VARCHAR(10)); INSERT INTO hello VALUES (19, 'hello world');
# 1. 初始化模組 go mod init mysql_demo # 2. 下載驅動 go get github.com/go-sql-driver/mysql
package main
import (
"database/sql"
"encoding/json"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Age int `json:"age"`
Name string `json:"name"`
}
func main() {
fmt.Println("start")
// DSN 格式: user:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
dsn := "peo:peo123@tcp(192.168.0.58:3306)/people?charset=utf8mb4&parseTime=True&loc=Local"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
defer db.Close()
// 連線池調優 (生產環境建議)
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(5 * time.Minute)
// 查詢
rows, err := db.Query("SELECT age, name FROM hello")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
u := &User{}
if err := rows.Scan(&u.Age, &u.Name); err != nil {
panic(err)
}
b, _ := json.Marshal(u)
fmt.Println(string(b))
}
if err := rows.Err(); err != nil {
panic(err)
}
fmt.Println("end")
}
| 參數 | 用途 |
|---|---|
charset=utf8mb4 | 連線字符集,支援 Emoji |
parseTime=True | 自動將 DATETIME/TIMESTAMP 轉為 time.Time |
loc=Local | 時區解析為本地時區 |
timeout=10s | 建立連線超時 |
readTimeout=30s | 讀取超時 |
SetMaxOpenConns 等) 避免連線洩漏。db.Ping() 啟動時驗證連線。db.Prepare) 防止 SQL 注入並重用執行計畫。db.SetConnMaxLifetime 配合監控)。sql.ErrNoRows、連線錯誤、資料錯誤。