Skip to content

使用sqlx

sqlx是一个三方库,是基于内置database/sql的一个扩展包。它包含database/sql的已有接口。

安装 sqlx

使用如下命令安装:

go
go get github.com/jmoiron/sqlx

handle 类

基本使用

连接数据库

由于 sqlx 是基于 database/sql,所以其有两种连接方式。

(1)、使用 Open 函数,如下:

go
var db *sqlx.DB

// 初始化数据库
func initDB(dsn string) (err error) {
	db, err = sqlx.Open("mysql", dsn)
	if err != nil {
		return
	}
	err = db.Ping()
	if err != nil {
		return
	}
    db.SetMaxIdleConns(10)
	db.SetMaxOpenConns(10)
	return
}

(2)、使用 NewDb 方法,如下:

go
var db *sqlx.DB

func initDB(dsn string) (err error) {
	db = sqlx.NewDb(sql.Open("mysql", dsn), "mysql")
	err = db.Ping()
	if err != nil {
		return
	}
    db.SetMaxIdleConns(10)
	db.SetMaxOpenConns(10)
	return
}

(3)、使用 connect 方法,如下:

go
var db *sqlx.DB
func initDB(dsn string) (err error) {
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		return
	}
	db.SetMaxIdleConns(10)
	db.SetMaxOpenConns(10)
	return
}

CRUD

查询

(1)、单行查询

go
func selectData(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.Printf("id:%d name:%s age:%d\n", u.ID, u.Name, u.Age)
}

(2)、多行查询

go
// 多行查询
func selectMutiData(id int) {
	sqlStr := "select id,name,age from user where id > ?"
	var u []user
	err := db.Select(&u, sqlStr, id)
	if err != nil {
		fmt.Println("查询失败.err:", err)
		return
	}
	for _, v := range u {
		fmt.Printf("id:%d name:%s age:%d\n", v.ID, v.Name, v.Age)
	}
}

插入、更新、删除

go
// 插入数据
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``db.Beginx()``tx.MustExec()`
go
func transactionDemo() {
	tx, err := db.Beginx() // 开启事务
	if err != nil {
		if tx != nil {
			tx.Rollback()
		}
		fmt.Printf("begin trans failed, err:%v\n", err)
		return
	}
	sqlStr1 := "Update user set age=40 where id=?"
	tx.MustExec(sqlStr1, 2)
	sqlStr2 := "Update user set age=50 where id=?"
	tx.MustExec(sqlStr2, 4)
	err = tx.Commit() // 提交事务
	if err != nil {
		tx.Rollback() // 回滚
		fmt.Printf("commit failed, err:%v\n", err)
		return
	}
	fmt.Println("exec trans success!")
}
最近更新