Go语言操作MySQL

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 或无响应。
### Go语言操作MySQL数据库 #### 连接与初始化 为了在Go语言操作MySQL数据库,首先需要安装`go-sql-driver/mysql`库作为驱动程序。该驱动被官方推荐用于连接和操作MySQL数据库[^3]。通过执行以下命令即可完成驱动的安装: ```bash go get -u github.com/go-sql-driver/mysql ``` 接着,在代码中导入必要的包以便建立数据库连接。通常会使用标准库中的`database/sql`包配合具体的驱动名称来创建连接实例。 ```go import ( "database/sql" _ "github.com/go-sql-driver/mysql" // 驱动注册 ) ``` 获得数据库连接的具体方法如下所示。这里定义了一个函数用来返回已经配置好的SQL句柄对象。 ```go func newDB() (*sql.DB, error) { dataSourceName := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := sql.Open("mysql", dataSourceName) if err != nil { return nil, err } // 测试连接有效性 if err = db.Ping(); err != nil { return nil, err } return db, nil } ``` 上述代码片段展示了如何构建一个完整的DSN字符串,并利用它打开一个新的数据库连接[^4]。注意替换其中的实际参数如用户名、密码、主机地址等以适配您的环境设置。 #### 数据插入 当成功建立了到目标数据库的有效链接之后就可以开始执行各种类型的SQL语句了。下面是一个简单的例子展示怎样向表里添加新纪录: ```go stmt, err := db.Prepare("INSERT INTO users(name,email) VALUES(?,?)") if err != nil { log.Fatal(err) } res, err := stmt.Exec("John Doe","john@example.org") if err != nil { log.Fatal(err) } lastInsertId, err := res.LastInsertId() fmt.Println(lastInsertId) ``` 这段脚本先准备了一条预处理过的SQL指令然后绑定具体值再提交给服务器端去运行最后获取刚产生的主键ID号。 #### 查询数据 对于读取存储于关系型表格内的资料而言有两种常见模式——单记录检索或多结果集扫描。以下是两种方式的例子说明: ##### 单行查询 如果预期只有一项匹配的结果或者只需要第一条满足条件的数据,则可采用此法。 ```go var name string err = db.QueryRow("SELECT name FROM users WHERE id=?", userId).Scan(&name) switch { case err == sql.ErrNoRows: fmt.Printf("User %d not found\n", userId) case err != nil: panic(err.Error()) // handle error properly instead of panicking in real code. default: fmt.Println("Found user:", name) } ``` ##### 多行查询 而面对可能含有多个符合条件项目的场景下则应该运用迭代器遍历整个集合直至结束为止。 ```go rows, err := db.Query("SELECT id,name FROM users ORDER BY created_at DESC LIMIT 10") defer rows.Close() for rows.Next(){ var id int var name string err = rows.Scan(&id,&name) if err!=nil{ break; } fmt.Printf("%d:%s\n",id,name); } ``` 以上两部分分别演示了针对不同需求情况下的基本查询技巧。 #### 更新/删除数据 除了增删查之外还经常涉及到修改现有字段的内容或者是彻底移除某些特定实体的操作过程。这些都可以借助标准化接口轻松达成目的。 更新示例: ```go result,err:=db.Exec("UPDATE users SET email=? WHERE id=?",newEmail,userId) affected,err=result.RowsAffected(); fmt.Printf("Updated %v row(s)\n", affected) ``` 删除示例: ```go result,err=db.Exec("DELETE FROM users WHERE id=?",userId) deleted,err=result.RowsAffected(); fmt.Printf("Deleted %v row(s)\n", deleted) ``` 这两个案例均体现了事务管理的重要性以及影响范围统计功能的应用价值所在。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值