Go-MySQL-Driver,让 Go 语言拥抱 MySQL
作者:Barry Yan
- 2022-11-11 北京
本文字数:1799 字
阅读完需:约 6 分钟
开源地址:https://github.com/go-sql-driver/mysql
1 简介
正如官方所说,Go-MySQL-Driver 是一个 Go 的 sql 或数据库操作包。
2 优势
纯粹的 Go 语言实现,轻量级和快速
z 支持 TCP/IPv4, TCP/IPv6, Unix 域套接字或自定义协议
自动处理断开的连接,自动连接池(通过数据库/sql 包)
支持大于 16MB 的查询
完整的 sql 体系,智能长数据处理
3 上手操作
3.1 建表
CREATE TABLE `student` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
复制代码
3.2 新建 Go Modoules 并下载 Go-MySQL-Driver 依赖
在项目根目录下执行:
go get -u github.com/go-sql-driver/mysql
复制代码
3.3 代码
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
)
var my_db *sql.DB //数据库
var my_tb = "student" //表名
/**
实体类
*/
type Student struct {
Id int
Name string
Age int
}
/**
数据库连接初始化
*/
func init() {
var err error
my_db, err = sql.Open("mysql", "root:12345678@tcp(127.0.0.1:3306)/test")
my_db.SetConnMaxLifetime(100 * time.Second) // 超时时间
my_db.SetMaxOpenConns(0) // 设置最大打开的连接数,默认值为0表示不限制。
my_db.SetMaxIdleConns(16) // 设置闲置的连接数
if err != nil {
fmt.Println("连接失败")
}
fmt.Println("连接成功") // 检查是否连接成功数据库
}
/**
查看全部
*/
func FindAllStudent() []Student {
var students []Student
var stu Student
rows, err := my_db.Query("SELECT * FROM " + my_tb)
if err != nil {
return nil
}
for rows.Next() {
err := rows.Scan(&stu.Id, &stu.Name, &stu.Age)
if err != nil {
return nil
}
students = append(students, stu)
}
return students
}
/**
添加一个
*/
func SaveAdminPwd(stu Student) bool {
tx, err := my_db.Begin()
if err != nil {
return false
}
stmt, err := tx.Prepare("INSERT INTO " + my_tb + "(id,name,age) VALUES (?,?,?)")
if err != nil {
return false
}
result, err := stmt.Exec(stu.Id, stu.Name, stu.Age)
tx.Commit()
if err != nil {
return false
}
println(result)
return true
}
/**
删除一个根据id
*/
func DeleteStudentById(id int) bool {
tx, err := my_db.Begin()
if err != nil {
return false
}
stmt, err := tx.Prepare("DELETE FROM " + my_tb + " WHERE id=?")
if err != nil {
return false
}
result, err := stmt.Exec(id)
if err != nil {
return false
}
tx.Commit() //别忘
println(result)
return true
}
/**
查看一个是否存在
*/
func GetStudentById(id int) Student {
var stu Student
stmt, err := my_db.Prepare("SELECT * FROM " + my_tb + " WHERE id=?")
rows, err := stmt.Query(id)
if err != nil {
return Student{}
}
if rows.Next() {
err := rows.Scan(&stu.Id, &stu.Name,&stu.Age)
if err != nil {
return Student{}
}
}
return stu
}
/**
修改一个
*/
func UpdateStudentById(stu Student) bool {
prepare, err := my_db.Prepare("UPDATE " + my_tb + " SET name=?,age=? WHERE id=?")
if err != nil {
return false
}
exec, err := prepare.Exec(stu.Name, stu.Age, stu.Id)
if err != nil {
return false
}
print(exec)
return true
}
/**
使用main函数测试
*/
func main() {
stu := Student{3, "ww", 32}
SaveAdminPwd(stu)
//DeleteStudentById(2)
studentById := GetStudentById(3)
fmt.Println(studentById)
UpdateStudentById(Student{3,"zsss",21})
s := GetStudentById(3)
fmt.Println(s)
students := FindAllStudent()
for _, stu := range students {
fmt.Println(stu)
}
}
复制代码
~
划线
评论
复制
发布于: 刚刚阅读数: 3
版权声明: 本文为 InfoQ 作者【Barry Yan】的原创文章。
原文链接:【http://xie.infoq.cn/article/e71c9beb5d8a8f20b11305131】。文章转载请联系作者。
Barry Yan
关注
做兴趣使然的Hero 2021-01-14 加入
Just do it.
评论