Go语言操作MySQL

科技   2024-08-06 14:29   上海  

工作中,DBA在准备一些自动化平台或者脚本时,需要我们掌握一些常用开发语言操作MySQL。

这一节内容,就来聊一下Go语言操作MySQL。


1 MySQL环境准备

可跳转到之前写的文章:MySQL 8.0 安装脚本


2 创建测试用户和测试表

在MySQL里面,创建测试用户和测试表:

CREATE USER 'go_rw'@'%' IDENTIFIED BY 'Ud7q_dac8';
GRANT insert,delete,select,update ON martin.* TO 'go_rw'@'%';
use martin
CREATE TABLE user_info ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT);


3 Go基础准备

可跳转:一文入门Go语言


4 编写Go操作MySQL的代码

package main
import ( //用于数据库操作的标准库,可以用来创建数据库连接,执行SQL语句等 "database/sql" //格式化输出的标准库 "fmt" //MySQL数据库的驱动程序 _ "github.com/go-sql-driver/mysql")
//定义表数据的结构体,当查询数据时,把结果临时存放在结构体里,最终输出type UserInfo struct { ID int Name string Age int}
//主函数func main() { //创建一个数据库连接对象 db, err := sql.Open("mysql", "go_rw:Ud7q_dac8@tcp(192.168.152.70:3306)/martin") //如果有错误,就输出 if err != nil { panic(err.Error()) } //延迟执行关闭数据库连接 defer db.Close()
// 插入数据 // 预编译SQL insertSQL, err := db.Prepare("INSERT INTO user_info(name, age) VALUES(?, ?)") if err != nil { panic(err.Error()) } //执行延迟关闭 defer insertSQL.Close()
//执行行插入操作 _, err = insertSQL.Exec("John Doe", 25) if err != nil { panic(err.Error()) }
fmt.Println("Inserted data successfully.")
// 查询数据 //查询用db.Query,将结果存放在rows变量中 rows, err := db.Query("SELECT id, name, age FROM user_info") if err != nil { panic(err.Error()) } defer rows.Close()
//定义一个users的变量,数据类型是结构体UserInfo,用来存放所有MySQL的查询结果。 var users []UserInfo
// 循环遍历每一行数据 for rows.Next() { //定义一个user的变量,用来在每个循环中存放每一行数据 var user UserInfo //通过rows.Scan将每一行的字段值赋给user这个变量 err := rows.Scan(&user.ID, &user.Name, &user.Age) if err != nil { panic(err.Error()) } users = append(users, user) }
fmt.Println("Result:") //循环展示切片users中的数据,也就是每一行的数据 for _, user := range users { fmt.Printf("ID: %d, Name: %s, Age: %d\n", user.ID, user.Name, user.Age) }
// 更新数据 // 通过db.Prepare预编译一个更新语句 updateSQL, err := db.Prepare("UPDATE user_info SET name=?, age=? WHERE id=?") if err != nil { panic(err.Error()) } defer updateSQL.Close()
//执行更新操作 _, err = updateSQL.Exec("Jane Smith", 30, 1) if err != nil { panic(err.Error()) }
fmt.Println("Updated data successfully.")
// 删除数据 //预编译删除语句 deleteSQL, err := db.Prepare("DELETE FROM user_info WHERE id=?") if err != nil { panic(err.Error()) } defer deleteSQL.Close() //执行删除操作 _, err = deleteSQL.Exec(1) if err != nil { panic(err.Error()) }
fmt.Println("Deleted data successfully.")}


5 安装依赖包

go get github.com/go-sql-driver/mysql


6 进行测试

可以注释其他几种操作,只保留一种,比如测试insert,就把select、update、delete部分暂时注释一下。


好的,今天的内容就到这里。


另外,我之前多次跟朋友推荐过《MySQL实战45讲》,最近又刷了1遍,真的忍不住再安利下,感觉不是一般的好。

看评论区有人说这个资料值得被所有开发同学看到,我只想说:我附议!再加上值得被所有DBA看到,看的我酣畅淋漓,有一种灵魂共振的快感。

可以试看,感兴趣的可以看看:



近期公众号热文:

MySQL主流高可用方案

建议收藏:一份完整的数据库规范

MySQL主库扛不住了?来试试读写分离吧

MySQL为什么不用Redo Log来进行主从复制?

MySQL数据库联盟
关注后,回复“高可用”,可获取8篇MySQL高可用文章
 最新文章