在 Golang 中读取 MySQL 数据库,通常使用 database/sql
标准库配合 MySQL 驱动(如 github.com/go-sql-driver/mysql
)。以下是完整示例:
1. 安装 MySQL 驱动
go get -u github.com/go-sql-driver/mysql
2. 连接 MySQL 数据库
(1) 基础连接
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql" // 匿名导入,仅初始化驱动
)
func main() {
// 格式: "username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True"
dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True"
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 测试连接
err = db.Ping()
if err != nil {
log.Fatal("Connection failed:", err)
}
fmt.Println("MySQL connected!")
}
(2) 连接池配置
db.SetMaxOpenConns(25) // 最大连接数
db.SetMaxIdleConns(5) // 空闲连接数
db.SetConnMaxLifetime(time.Minute * 5) // 连接存活时间
3. CRUD 操作示例
假设有一张表 users
:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
(1) INSERT (创建数据)
result, err := db.Exec(
"INSERT INTO users (name, email) VALUES (?, ?)",
"Alice",
"alice@example.com",
)
if err != nil {
log.Fatal(err)
}
id, _ := result.LastInsertId()
fmt.Printf("Inserted ID: %d\n", id)
(2) SELECT (查询单行)
var user struct {
ID int64
Name string
Email string
}
err := db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", 1).Scan(
&user.ID,
&user.Name,
&user.Email,
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", user)
(3) SELECT (查询多行)
rows, err := db.Query("SELECT id, name, email FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var user struct {
ID int64
Name string
Email string
}
err = rows.Scan(&user.ID, &user.Name, &user.Email)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", user)
}
if rows.Err() != nil { //检查遍历是否出错
log.Fatal(rows.Err())
}
(4)UPDATE (更新数据)
result ,err:=db .Exec ("UPDATE users SET name=? WHERE id=?", "Bob" ,1 )
if err!=nil {
log .Fatal (err )
}
affected,_:=result.RowsAffected ()
fmt.Printf ("Updated %d row(s)\n" ,affected )
#### (5)DELETE (删除数据)
result ,err:=db .Exec ("DELETE FROM users WHERE id=?" ,1 )
if err!=nil {
log .Fatal (err )
}
affected,_:=result.RowsAffected ()
fmt.Printf ("Deleted %d row(s)\n" ,affected )
### 4。事务处理
tx ,err:=db.Begin ()
if err!=nil {
log .Fatal (err )
}
_,execErr:=tx.Exec ("INSERT INTO users(name ,email )VALUES(? ,?)","Eve","eve@example.com")
_,execErr2:=tx.Exec ("UPDATE accounts SET balance=balance-100 WHERE user_id=?",3 )
if execErr!=nil || execErr2!=nil{
_=tx.Rollback ()
log .Fatal ("Transaction failed")
} else{
_=tx.Commit ()
fmt.Println("Transaction succeeded!")
}
### 5。ORM推荐(可选)
如果需要更高级的ORM功能:
### 6。常见错误排查
|问题|解决方案|
|—|—|
|dial tcp timeout
|检查MySQL服务是否运行、防火墙规则|
|Access denied
|验证用户名/密码是否正确|
|driver not found
|确保匿名导入_ "github.com/go-sql-driver/mysql"
|
通过以上步骤即可完成Golang与MySQL的基础交互!
内容由零声教学AI助手提供,问题来源于学员提问