go学习之 sqlx的基本使用

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)
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用sqlx库打印SQL语句的方法非常简单。sqlx是Go语言中一个强大的SQL执行库,它不仅提供了常用的SQL执行功能,还能轻松地打印生成的SQL语句。 首先,我们需要导入sqlx库,并创建一个SQL连接。连接可以使用sqlx.Open方法创建,并指定数据库类型和连接信息。例如,使用MySQL的连接可以像下面这样创建: db, err := sqlx.Open("mysql", "username:password@tcp(localhost:3306)/database") 接下来,我们可以使用sqlx库提供的Exec、Query和QueryRow等方法执行SQL语句。这些方法会返回sql.Result、sql.Rows和sql.Row等结果,我们可以通过调用Result对象的方法获取受影响的行数,或者通过Rows和Row对象的Scan方法获取查询结果。 要打印生成的SQL语句,我们可以使用db.Rebind方法,它会将SQL语句中的占位符替换为对应数据库的占位符。例如,MySQL的占位符是"?",而PostgreSQL的占位符是"$1"、"$2"等。 我们还可以使用sqlx内部提供的方法来打印生成的SQL语句。例如,通过调用sqlx包的NamedExec方法时,在下面的代码中,我们可以使用sqlx.Expand方法来打印生成的SQL语句: stmt, err := db.PrepareNamed("INSERT INTO mytable (name, age) VALUES (:name, :age)") expandedSQL, params, err := sqlx.Expand(stmt.SQL, stmt.NamedStmt.NamedArgs) fmt.Println(expandedSQL) 这样我们就可以打印出生成的SQL语句了。 总的来说,使用sqlx库打印SQL语句非常简单。只需要使用db.Rebind和sqlx.Expand等方法就可以轻松地获取生成的SQL语句。这对于调试和优化SQL语句非常有帮助,帮助我们更好地了解程序执行的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值