环境
go version:go1.14.4
go-mysql-driver:github.com/go-sql-driver/mysql
首先使用go mod init初始化项目的模块文件并做相关操作,关于go module可详见此链接
go测试Mysql连接
声明,以下代码中引用自博客:https://blog.csdn.net/naiwenw/article/details/79281220
- import相关依赖:
import (
"database/sql"
_"github.com/go-sql-driver/mysql"
)
备注:database/sql提供一些操作SQL数据库的接口,它必须与某特定数据库的driver一起使用,第二项即引入mysql的drive。github.com/go-sql-driver/mysql前的下划线代表只是调用包的init函数,因为github.com/go-sql-driver/mysql只是作为驱动,我们不会调用它的函数,所以加下划线不会提示包未引用的错误
- 本地开启数据库,使用代码测试连通性
定义相关常量:
const (
userName = "root" //登录Mysql的用户名
password = "passwd" //对应用户名的密码
ip = "127.0.0.1" //ip地址
port = "3306" //端口
dbName = "dbName" //数据库名字
)
创建一个DB对象
var DB *sql.DB
将DB变量与数据库关联
func InitDB() {
//构建连接:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8"
path := strings.Join([]string{userName, ":", password, "@tcp(",ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
//打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql"
DB, _ = sql.Open("mysql", path)
//设置数据库最大连接数
DB.SetConnMaxLifetime(100)
//设置上数据库最大闲置连接数
DB.SetMaxIdleConns(10)
//验证连接
if err := DB.Ping(); err != nil{
fmt.Println("opon database fail")
return
}
fmt.Println("connnect success")
}
如果运行之后打印connect success,则代表连接mysql成功
插入操作
- 使用上一部分中与数据库关联的DB变量,构造事务
tx, err := DB.Begin()
if err != nil {
fmt.Println("tx fail")
return false
}
- 传入sql语句,并执行
stmt,err := tx.Prepare("insert into auth_group(`col1Name`,`col2Name`) values (?,?)")//?用于后面传参
if err !=nil {
fmt.Println("prepare fail")
return false
}
res,err := stmt.Exec(user.Id,user.Name)
if err != nil{
fmt.Println("resut fail")
return false
}
- 提交事务,并打印插入的id号
tx.Commit()
fmt.Println(res.LastInsertId())
完整代码:
type group struct{
Id int
Name string
}
func Insert(user group ) bool{
tx, err := DB.Begin()
if err != nil {
fmt.Println("tx fail")
return false
}
stmt,err := tx.Prepare("insert into auth_group(`id`,`name`) values (?,?)")
if err !=nil {
fmt.Println("prepare fail")
return false
}
res,err := stmt.Exec(user.Id,user.Name)
if err != nil{
fmt.Println("resut fail")
return false
}
tx.Commit()
fmt.Println(res.LastInsertId())
return true
}
查询操作
- 查询单行
DB.QueryRow("SELECT * FROM auth_group where id = ?",id).Scan(&user.Id,&user.Name)
QueryRow:最多返回一行,查询不到结果或查询结果多于一行都将产生错误。
Scan:将结果存入某个结构体,以便返回给查询者
完整代码:
func Select(id int) group{
var user group
err := DB.QueryRow("SELECT * FROM auth_group where id in (1,2)",id).Scan(&user.Id,&user.Name)
if err !=nil{
fmt.Println("查询出错11")
}
return user
}
- 查询多行
- 得到查询结果集合
rows,err := DB.Query("SELECT * from auth_group")
Query:执行查询语句,并返回Rows对象
- 遍历rows
for rows.Next(){
var user group
err := rows.Scan(&user.Id,&user.Name)//此行的结果
if err != nil {
fmt.Println("rows fail")
}
users=append(users,user)//将此次扫描的结果放入users集合
}
完整代码:
func SelectAll() []group {
rows,err := DB.Query("SELECT * from auth_group")
if err !=nil{
fmt.Println("查询出错")
}
var users []group
for rows.Next(){
var user group
err := rows.Scan(&user.Id,&user.Name)
if err != nil {
fmt.Println("rows fail")
}
users=append(users,user)
}
return users
}
Delete操作
与insert操作类似,首先通过DB.Begin()获取事务实例,然后通过tx执行删除语句,最后执行事务的提交
完整代码:
func Delete(id int) bool{
tx,err :=DB.Begin()
if err!=nil{
fmt.Println("delete tx fail")
return false
}
stmt,err :=tx.Prepare("delete from auth_group where id =?")
if err !=nil{
fmt.Println("delete stmt fail")
return false
}
res,err := stmt.Exec(id)
if err!=nil{
fmt.Println("delete res fail")
return false
}
tx.Commit()
fmt.Println(res.RowsAffected())
return true
}
Update操作
与insert操作类似,首先通过DB.Begin()获取事务实例,然后通过tx执行update语句,最后执行事务的提交
完整代码:
func Update(id int,name string) bool{
tx, err := DB.Begin()
if err != nil{
fmt.Println("tx fail")
}
//准备sql语句
stmt, err := tx.Prepare("UPDATE auth_group SET name = ? WHERE id = ?")
if err != nil{
fmt.Println("Prepare fail")
return false
}
//设置参数以及执行sql语句
_, err = stmt.Exec(name, id)
if err != nil{
fmt.Println("Exec fail")
return false
}
//提交事务
tx.Commit()
return true
}
最后:
database/sql API官方文档:https://golang.org/pkg/database/sql/#DB.Query
本文地址:https://blog.csdn.net/qq_44025685/article/details/107134529