Go语言操作MySQL
一、前言
Go语言在构建高性能后端服务时,常常需要与数据库交互。本文将介绍如何使用Go语言标准库 database/sql 搭配常用驱动 go-sql-driver/mysql,完成从连接数据库到增删改查的完整流程。
二、环境准备
安装MySQL驱动
在你的Go项目中执行以下命令安装MySQL驱动:
go get -u github.com/go-sql-driver/mysql
引入必要包
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
三、连接数据库
定义连接信息并建立连接:
dsn := "username:password@tcp(127.0.0.1:3306)/testdb"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(err)
}
defer db.Close()
// 测试连接是否成功
if err := db.Ping(); err != nil {
panic(err)
}
fmt.Println("连接数据库成功!")
设置连接池参数(可选):
db.SetMaxOpenConns(10) // 最大连接数
db.SetMaxIdleConns(5) // 最大空闲连接数
四、基础CRUD操作
1. 插入数据(INSERT)
sqlStr := "INSERT INTO users(name, age) VALUES (?, ?)"
res, err := db.Exec(sqlStr, "Alice", 25)
if err != nil {
fmt.Println("插入失败:", err)
return
}
id, _ := res.LastInsertId()
fmt.Println("插入成功,ID:", id)
2. 查询数据(SELECT)
查询单行
sqlStr := "SELECT id, name, age FROM users WHERE id = ?"
var id int
var name string
var age int
err := db.QueryRow(sqlStr, 1).Scan(&id, &name, &age)
if err != nil {
fmt.Println("查询失败:", err)
return
}
fmt.Println("查询结果:", id, name, age)
查询多行
sqlStr := "SELECT id, name, age FROM users"
rows, err := db.Query(sqlStr)
if err != nil {
fmt.Println("查询失败:", err)
return
}
defer rows.Close()
for rows.Next() {
var id int
var name string
var age int
err := rows.Scan(&id, &name, &age)
if err != nil {
fmt.Println("读取行失败:", err)
continue
}
fmt.Println(id, name, age)
}
3. 更新数据(UPDATE)
sqlStr := "UPDATE users SET age = ? WHERE name = ?"
res, err := db.Exec(sqlStr, 30, "Alice")
if err != nil {
fmt.Println("更新失败:", err)
return
}
rowsAffected, _ := res.RowsAffected()
fmt.Println("更新成功,影响行数:", rowsAffected)
4. 删除数据(DELETE)
sqlStr := "DELETE FROM users WHERE name = ?"
res, err := db.Exec(sqlStr, "Alice")
if err != nil {
fmt.Println("删除失败:", err)
return
}
rowsAffected, _ := res.RowsAffected()
fmt.Println("删除成功,影响行数:", rowsAffected)
五、使用结构体封装查询结果
定义结构体:
type User struct {
ID int
Name string
Age int
}
查询并封装结果:
sqlStr := "SELECT id, name, age FROM users"
rows, err := db.Query(sqlStr)
if err != nil {
fmt.Println("查询失败:", err)
return
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
err := rows.Scan(&user.ID, &user.Name, &user.Age)
if err != nil {
fmt.Println("读取失败:", err)
continue
}
users = append(users, user)
}
fmt.Println("用户列表:", users)
六、错误处理与资源释放
- 所有数据库连接建议使用
defer db.Close()及时关闭。 - 对于查询结果
rows,需要在使用后defer rows.Close()。 - 所有操作都应处理
err,避免程序 panic 或无响应。
871

被折叠的 条评论
为什么被折叠?



