在Go语言中操作MySQL数据库,修改数据看似简单,实则暗藏玄机!
在这个数据驱动的时代,掌握Go语言与MySQL数据库的交互技能已成为后端开发的必备技能。今天,我们将深入探讨Go-MySQL中数据修改的艺术,从基础更新到高级技巧,带你一步步成为数据库操作高手!
一、开启Go-MySQL之旅:准备工作
在开始修改数据之前,我们需要做好准备工作。就像厨师做菜前要先准备食材一样,程序员在操作数据库前也需要先建立连接。
安装MySQL驱动
首先,我们需要安装Go语言的MySQL驱动。打开终端,执行以下命令:
go get -u github.com/go-sql-driver/mysql
这个驱动是Go语言中最流行、最稳定的MySQL驱动程序,完全兼容Go自带的database/sql包。
建立数据库连接
接下来,我们创建一个Go程序来连接MySQL数据库:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
func initDB() {
var err error
dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"
db, err = sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
if err := db.Ping(); err != nil {
log.Fatalf("无法连接到数据库: %v", err)
}
// 配置连接池
db.SetMaxOpenConns(100) // 设置最大打开连接数
db.SetMaxIdleConns(50) // 设置最大空闲连接数
fmt.Println("数据库连接成功!")
}
需要注意的是,sql.Open()函数并不会真正建立与数据库的连接,它只是验证参数是否正确。真正的连接是在执行第一个查询时建立的。因此,我们使用db.Ping()方法来验证连接是否成功。
连接字符串中的parseTime=True参数非常重要,它允许Go将MySQL的datetime和timestamp类型自动转换为Go的time.Time类型。
二、基础更新操作:初探数据修改
最简单的更新操作是使用db.Exec()方法直接执行SQL语句。让我们从一个简单的示例开始:
func updateUserAge(id int, newAge int) {
result, err := db.Exec("UPDATE users SET age = ? WHERE id = ?", newAge, id)
if err != nil {
log.Fatalf("更新数据失败: %v", err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
log.Fatalf("获取影响行数失败: %v", err)
}
fmt.Printf("更新完成,影响行数: %d\n", rowsAffected)
}
在这个例子中,我们使用了参数化查询,通过?占位符来传递参数。这种做法不仅可以防止SQL注入攻击,还能提高代码的可读性和安全性。
获取更新结果
执行更新操作后,我们通常想知道操作影响了多少行数据。RowsAffected()方法返回被更新、删除或插入的行数。这在业务逻辑中非常有用,比如我们可以检查是否成功更新了目标行:
func updateUserName(id int, newName string) bool {
result, err := db.Exec("UPDATE users SET name = ? WHERE id = ?", newName, id)
if err != nil {
log.Printf("更新数据失败: %v", err)
return false
}
rowsAffected, _ := result.RowsAffected()
return rowsAffected > 0
}
如果RowsAffected()返回0,表示没有找到匹配的记录,这可能是由于提供的ID不存在。
三、预处理语句:提升性能与安全
对于需要多次执行的更新操作,使用预处理语句可以显著提高性能和安全性。预处理语句只需编译一次SQL语句,然后可以多次执行,特别适用于批量更新操作。
创建预处理语句
func updateUsersWithPrepare(updates []struct {
id int
age int
}) {

最低0.47元/天 解锁文章

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



