golang连接并操作mysql数据库的关键步骤如下:1.安装驱动包,使用go get -u github.com/go-sql-driver/mysql下载驱动,并在代码中通过import \_ "github.com/go-sql-driver/mysql"引入;2.连接数据库,使用sql.open()函数传入驱动名和连接字符串建立连接,并通过ping检查连通性;3.执行查询与插入操作,queryrow用于查询单条数据,query用于获取多条数据,exec用于执行插入语句;4.设置连接池参数,推荐配置db.setmaxopenconns、db.setmaxidleconns和db.setconnmaxlifetime优化性能。掌握这些步骤即可实现稳定可靠的数据库访问。

Golang连接并操作MySQL数据库,主要依赖标准库database/sql配合第三方驱动实现。常用的驱动是go-sql-driver/mysql,它实现了database/sql接口,可以满足大多数数据库操作需求。

下面从实际开发角度出发,介绍几个关键步骤和使用技巧。

安装驱动包
要让Go程序支持MySQL,首先要安装MySQL驱动:
立即学习“go语言免费学习笔记(深入)”;
go get -u github.com/go-sql-driver/mysql
这个命令会下载并安装驱动包。之后在代码中通过import _ "github.com/go-sql-driver/mysql"引入驱动(注意前面的下划线),这样Go才会注册该驱动,后续才能使用。

连接数据库
连接MySQL的核心是sql.Open()函数,传入驱动名和连接字符串:
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
log.Fatal(err)
}-
"mysql":指定使用的驱动。 -
user:password@tcp(...):格式为用户名、密码、地址等信息组成的DSN(Data Source Name)。 -
sql.Open()并不会立即建立连接,而是“懒加载”,第一次使用时才真正连接。
建议加上Ping检查是否连通:
err = db.Ping()
if err != nil {
log.Fatal("数据库无法连接:", err)
}执行查询与插入操作
查询单条数据(QueryRow)
适合用于查询一条记录的情况:
var name string
err := db.QueryRow("SELECT name FROM users WHERE id = ?", 1).Scan(&name)
if err != nil {
log.Println("查询失败:", err)
}
fmt.Println("用户名:", name)-
QueryRow()返回一个Row对象。 - 使用
.Scan()将结果映射到变量上。 - 如果查不到数据,
Scan()会报错,可以用errors.Is(err, sql.ErrNoRows)判断。
查询多条数据(Query)
如果需要获取多个结果,用Query():
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
err := rows.Scan(&id, &name)
if err != nil {
log.Println("读取行失败:", err)
continue
}
fmt.Println(id, name)
}- 注意要调用
rows.Close()释放资源。 - 遍历结果用
Next()方法逐行处理。
插入数据(Exec)
执行INSERT语句使用Exec(),不会返回结果集:
result, err := db.Exec("INSERT INTO users (name) VALUES (?)", "Tom")
if err != nil {
log.Fatal(err)
}
lastId, _ := result.LastInsertId()
rowCnt, _ := result.RowsAffected()
fmt.Printf("最后插入ID: %d, 受影响行数: %d\n", lastId, rowCnt)-
LastInsertId()适用于自增主键。 -
RowsAffected()返回受影响的行数。
设置连接池参数(推荐配置)
默认情况下,Go的连接池可能不够灵活,可以通过设置参数来优化性能:
db.SetMaxOpenConns(10) // 最大打开连接数 db.SetMaxIdleConns(5) // 最大空闲连接数 db.SetConnMaxLifetime(time.Minute * 5) // 连接最大存活时间
这些参数对高并发场景很重要,避免连接泄漏或频繁创建销毁带来的性能损耗。
基本上就这些常用操作了。虽然Go的标准库封装得比较底层,但结构清晰,也方便封装成更高级的工具函数或ORM层。只要理解sql.DB、Row、Rows这几个核心类型的行为,就能写出稳定可靠的数据库访问代码。










