欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

go连接Mysql

程序员文章站 2022-03-30 09:29:14
环境go version:go1.14.4go-mysql-driver:github.com/go-sql-driver/mysql首先使用go mod init初始化项目的模块文件并做相关操作,关于go module可详见此链接go测试Mysql连接import相关依赖:import ("database/sql"_"github.com/go-sql-driver/mysql")备注:database/sql提供一些操作SQL数据库的接口,它必须与某特定数据库的drive...

环境

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