sqlx介绍

在项目中我们通常可能会使用database/sql连接MySQL数据库。
sqlx可以认为是Go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组扩展。还有其他一些超级有用的功能。

sqlx安装

go get github.com/jmoiron/sqlx
  • 使用goland工具也可以直接导入依赖的。
  • 当依赖出现漏缺的时候可以使用命令来修复
go mod tidy

sqlx的基本使用

连接数据库

var db *sqlx.DB

func initDB() (err error) {
	dsn := "root:root@tcp(127.0.0.1:3306)/junmu?charset=utf8mb4&parseTime=True"
	// 也可以使用MustConnect连接不成功就panic
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		fmt.Printf("connect DB failed, err:%v\n", err)
		return
	}
	db.SetMaxOpenConns(20)
	db.SetMaxIdleConns(10)
	return
}
  • 设置一个全局变量进行全局的操作,方便一点。

查询

所用结构体:

type User struct {
	Id uint
	Name string
	Age uint
}

单行查询

// 单行查询
func find(id int){
	sqlStr := "select id,name,age from user where id = ?"
	var u User
	err := db.Get(&u,sqlStr,id)
	if err != nil {
		fmt.Println("查询单行失败!!!err:",err)
		return
	}
	fmt.Println(u)
}

多行查询

// 多行查询  Select
func findAll(id int)  {
	sqlStr := "select id,name,age from user where id < ?"
	var users []User
	err := db.Select(&users,sqlStr,10)
	if err != nil {
		fmt.Println("查询多行失败!!! err:",err)
		return
	}
	for _,u := range users {
		fmt.Println(u)
	}
}

插入、修改更新、删除

  • sqlx中的exec方法和原生里面的sql中的exec基本上一样:
// 插入数据
func insertRowDemo() {
	sqlStr := "insert into user(name, age) values (?,?)"
	ret, err := db.Exec(sqlStr, "沙河小王子", 19)
	if err != nil {
		fmt.Printf("insert failed, err:%v\n", err)
		return
	}
	theID, err := ret.LastInsertId() // 新插入数据的id
	if err != nil {
		fmt.Printf("get lastinsert ID failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert success, the id is %d.\n", theID)
}

// 更新数据
func updateRowDemo() {
	sqlStr := "update user set age=? where id = ?"
	ret, err := db.Exec(sqlStr, 39, 6)
	if err != nil {
		fmt.Printf("update failed, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("update success, affected rows:%d\n", n)
}

// 删除数据
func deleteRowDemo() {
	sqlStr := "delete from user where id = ?"
	ret, err := db.Exec(sqlStr, 6)
	if err != nil {
		fmt.Printf("delete failed, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("get RowsAffected failed, err:%v\n", err)
		return
	}
	fmt.Printf("delete success, affected rows:%d\n", n)
}

sqlx.in实现批量插入

  • 在使用这个进行批量插入之前,我们需要将我们的结构体实现里面的一个接口
func (u User) Value() (driver.Value, error) {
	return []interface{}{u.Name, u.Age}, nil
}
  • 然后看看具体实现吧!
func insertAll()error{
	sqlStr := "insert into user(name,age) values(?),(?),(?),(?),(?)"
	users := []interface{}{
		User{Name: "骚包1号",Age: 21},
		User{Name: "骚包2号",Age: 22},
		User{Name: "骚包3号",Age: 23},
		User{Name: "骚包4号",Age: 24},
		User{Name: "骚包5号",Age: 25},
	}
	query,args,_ := sqlx.In(
		sqlStr,
		users...,
		)
	fmt.Println(query)   // 查看生成的查询语句
	fmt.Println(args)	// 查看生成的args
	_,err := db.Exec(query,args...)
	return err
}

sqlx.in 查询

  • 查询id我们需要给定一些id集合才可以哈
// 通过ids进行查询数据
func findUserByIds()  {
	sqlStr := "select id,name,age from user where id in (?)"
	ids := []int{1,2,3,4,5}
	// 动态进行查询
	query,args,_ := sqlx.In(sqlStr,ids)
	query = db.Rebind(query)
	var users []User
	db.Select(&users,query,args...)
	fmt.Println(users)
}
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐