go连接Mysql

环境

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

  1. 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只是作为驱动,我们不会调用它的函数,所以加下划线不会提示包未引用的错误

  1. 本地开启数据库,使用代码测试连通性
    定义相关常量:
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成功

插入操作

  1. 使用上一部分中与数据库关联的DB变量,构造事务
tx, err := DB.Begin()
	if err != nil {
		fmt.Println("tx fail")
		return false
	}
  1. 传入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
	}
  1. 提交事务,并打印插入的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
}
  • 查询多行
  1. 得到查询结果集合
rows,err := DB.Query("SELECT * from auth_group")

Query:执行查询语句,并返回Rows对象

  1. 遍历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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐