# Ubuntu 安裝 MySQL sudo apt-get install mysql-server # 記住 root 密碼,假設 root123 # 進入 MySQL 建立測試環境 mysql -uroot -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'; -- 允許遠程 EXIT; # 調整綁定 IP sudo nano /etc/mysql/my.cnf # bind-address = 127.0.0.1 改為 bind-address = 你的伺服器IP sudo /etc/init.d/mysql restart # 建表測試資料 mysql -upeo -p USE people; CREATE TABLE hello(age INT, name VARCHAR(10)); INSERT INTO hello(age, name) VALUES(19, 'hello world');
go get github.com/go-sql-driver/mysql
驅動會下載至 $GOPATH/pkg/mod。
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=utf8
db, err := sql.Open("mysql", "peo:peo123@tcp(192.168.0.58:3306)/people?charset=utf8")
if err != nil {
panic(err)
}
defer db.Close()
rows, err := db.Query("SELECT age, name FROM hello")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
user := &User{}
err = rows.Scan(&user.Age, &user.Name)
if err != nil {
panic(err)
}
b, _ := json.Marshal(user)
fmt.Println(string(b))
}
fmt.Println("end")
}
_ "github.com/go-sql-driver/mysql" 僅執行驅動的 init() 註冊自身。sql.Open 不會建立實際連線,首次 Query/Exec 才從連線池取出。log.Fatal 或自定義錯誤類型,避免 panic 導致服務崩潰。db.Query("SELECT ... WHERE id = ?", id) 防 SQL 注入。json:"field" 控制輸出鍵名。bind-address、防火牆 3306、使用者 @'%' 權限。?charset=utf8mb4,資料表亦用 utf8mb4。defer rows.Close()、defer db.Close()。