乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

    • Golang基础知识

    • Golang进阶知识

      • 使用database_sql
      • 使用sqlx
        • 安装 sqlx
        • handle 类
        • 基本使用
          • 连接数据库
          • CRUD
          • 查询
          • 插入、更新、删除
          • 事务操作
      • 操作Redis
      • 操作NSQ
      • 操作kafka
      • 操作Etcd
      • 操作ElasticSearch
    • Golang常用包

  • AIOps

  • 专栏
  • Golang
  • Golang进阶知识
乔克
2025-07-13
目录

使用sqlx

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

# 安装 sqlx

使用如下命令安装:

go get github.com/jmoiron/sqlx
1

# handle 类

sqlx 最大可能去实现 database/sql 一样的功能。有 4 中主要 handle 类型:

  • sqlx.DB - 相当于 database/sql 中的 sql.DB,代表一个数据库。
  • sqlx.Tx - 相当于 database/sql 中的 sql.Tx,代表一个事务。
  • sqlx.Stmt = 相当于 database/sql 中的 sql.Stmt,代表一条要执行的预处理语句。
  • sqlx.NamedStmt - 代表一条有参数的执行语句。

所有 handle 类型内嵌实现了对应 database/sql 中 handle。也就是说,当你在代码中调用 sqlx.DB.Query 的时候,同时也会调用执行到 sql.DB.Query 对应的代码。

除此之外,还有两种指针类型:

  • sqlx.Rows - 相当于 sql.Rows, 从 Queryx 返回的指针;
  • sqlx.Row - 相当于 sql.Row, 从 QueryRowx 返回的结果;

跟 handle 类型一样,sqlx.Rows 内嵌了 sql.Rows。犹豫 sql.Row 的底层实现未公开,sqlx.Row 只是实现了 sql.Row 的部分标准接口。

# 基本使用

# 连接数据库

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

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

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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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

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
}
1
2
3
4
5
6
7
8
9
10
11
12

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

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
}
1
2
3
4
5
6
7
8
9
10

# CRUD

# 查询

(1)、单行查询

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)
}
1
2
3
4
5
6
7
8
9
10
11

(2)、多行查询

// 多行查询
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)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 插入、更新、删除

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)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 事务操作

对于事务操作,我们可以使用sqlx中提供的db.Beginx()和tx.MustExec()方法来简化错误处理过程。

示例代码如下:

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!")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上次更新: 2025/07/18, 11:04:43
使用database_sql
操作Redis

← 使用database_sql 操作Redis→

最近更新
01
2025年,SRE在企业中可以做哪些事
07-18
02
SRE 如何提升自己在团队中的影响力
07-18
03
使用Go开发MCP服务
07-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式