Go语言增强版操作MySQL(SQLX)

数据库 MySQL
上次咱们学习了如何使用Go操作Mysql,并且实现了简单的增删改查。但是相对来说,还有有点复杂的,可能那些大佬也都觉得繁琐叭。就又开发出了增强版查询Mysql操作库Sqlx。

前言

上次咱们学习了如何使用Go操作Mysql,并且实现了简单的增删改查。

但是相对来说,还有有点复杂的,可能那些大佬也都觉得繁琐叭。

就又开发出了增强版查询Mysql操作库Sqlx。

mod文件

go.mod

  1. module sqlxDemo 
  2.  
  3. go 1.14 
  4.  
  5. require ( 
  6.     github.com/go-sql-driver/mysql v1.4.0 
  7.     github.com/jmoiron/sqlx v1.2.0 
  8.     google.golang.org/appengine v1.6.7 // indirect 

创建数据表

创建表代码

  1. CREATE TABLE `userinfo` ( 
  2.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(10) DEFAULT NULL, 
  4.   `phone` char(11) DEFAULT NULL, 
  5.   `address` varchar(64) DEFAULT NULL, 
  6.   PRIMARY KEY (`id`) 
  7. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4; 

创建结构体

结构体代码

  1. type Userinfo struct { 
  2.     Id      int64  `json:"id"
  3.     Name    string `json:"name"
  4.     Phone   string `json:"phone"
  5.     Address string `json:"address"

连接数据库

代码

  1. import ( 
  2.     "fmt" 
  3.     _ "github.com/go-sql-driver/mysql" 
  4.     "github.com/jmoiron/sqlx" 
  5. type Userinfo struct { 
  6.     Id      int64  `json:"id"
  7.     Name    string `json:"name"
  8.     Phone   string `json:"phone"
  9.     Address string `json:"address"
  10. func main() { 
  11.     dsn := "root:rootroot@tcp(127.0.0.1:3306)/go_mysql_demo?charset=utf8mb4&parseTime=True" 
  12.     // 使用 MustConnect 连接的话,验证失败不成功直接panic 
  13.     //db := sqlx.MustConnect("mysql", dsn) 
  14.  
  15.     //使用 Connect 连接,会验证是否连接成功, 
  16.     db, err := sqlx.Connect("mysql", dsn) 
  17.  
  18.     if err != nil { 
  19.         fmt.Printf("connect DB failed, err:%v\n", err) 
  20.         return 
  21.     db.SetMaxOpenConns(20) 
  22.     db.SetMaxIdleConns(10) 

查询单条

我记得使用原来的方式进行查询并且绑定结构体,是这审的。

  1. //查询单条 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;" 
  3. var user Userinfo 
  4. err = db.QueryRow(sqlStr, 1).Scan(&user.Id, &user.Name, &user.Phone, &user.Address) 
  5. if err != nil { 
  6.     fmt.Println("查询失败", err) 
  7.     return 

看第4行代码,需要将结构体的字段一个一个点上去。

如果使用sqlx呢?

代码

  1. //查询 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;" 
  3. var user Userinfo 
  4. err = db.Get(&user, sqlStr, 1) 
  5. if err != nil { 
  6.     fmt.Println("查询失败:", err) 
  7.     return 
  8. fmt.Println("user:"user

执行结果


还是第4行代码,直接一个结构体扔过去,就绑定成功了。

如果表有很多字段,结构体字段也有很多,这个是很有用的。

查询多条

还是惯例,看看原来是怎么查的。

  1. //查询多条 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" 
  3. //参数同 QueryRow 
  4. rows, err := db.Query(sqlStr, 1) 
  5. //处理err 
  6. // 此处使用rows释放所有链接 
  7. defer rows.Close() 
  8. //循环整理所有数据 
  9. var userList = make([]Userinfo, 0, 10) 
  10. for rows.Next() { 
  11.     var user Userinfo 
  12.     err = rows.Scan(&user.Id, &user.Name, &user.Phone, &user.Address) 
  13.     //处理err 
  14.     userList = append(userList, user
  15. fmt.Println(userList) 

为了方便,我去掉了err,使用伪代码处理err代替。

原来的方法,查询出来还得需要一个循环,还需要一个切片,乖乖嘞,打扰了。

来看看sqlx

代码

  1. //查询多条 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" 
  3. var userList []Userinfo 
  4. err = db.Select(&userList, sqlStr, 1) 
  5. if err != nil { 
  6.     fmt.Println("查询失败:", err) 
  7.     return 
  8. fmt.Println("userList:",userList) 

执行结果


还是直接扔过去,就绑定完成了,真是美滋滋。

添加

额,添加,更新,删除,事物的话,似乎跟原来差不多,直接看代码叭。

代码

  1. //添加 
  2. sqlStr := "INSERT into userinfo(name,phone,address) values(?,?,?);" 
  3. result, err := db.Exec(sqlStr, "吴彦祖", 555, "不知道哪的"
  4. if err != nil { 
  5.     fmt.Println("插入失败", err) 
  6.     return 
  7. row_affect, err := result.RowsAffected() 
  8. if err != nil { 
  9.     fmt.Println("受影响行数获取失败:", err) 
  10.     return 
  11. fmt.Println("受影响的行数:", row_affect) 
  12. lastId, err := result.LastInsertId() 
  13. if err != nil { 
  14.     fmt.Println("新增行id获取失败:", err) 
  15.     return 
  16. fmt.Println("新增行id:", lastId) 
  17. fmt.Println("插入成功"

执行结果


Mysql


更新

代码

  1. //更新数据 
  2. sqlStr := `UPDATE userinfo set name=? where id=?;` 
  3. result, err := db.Exec(sqlStr, "吴彦祖666", 4) 
  4. if err != nil { 
  5.     fmt.Println("更新失败", err) 
  6.     return 
  7. //受影响的行数 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影响行数获取失败:", err) 
  11.     return 
  12. fmt.Println("受影响的行数:", row_affect) 
  13.  
  14. fmt.Println("更新成功"

执行结果

Mysql


删除

代码

  1. sqlStr := "delete from userinfo where id = ?;" 
  2. result, err := db.Exec(sqlStr, 4) 
  3. if err != nil { 
  4.     fmt.Println("删除失败", err) 
  5.     return 
  6. //受影响的行数 
  7. row_affect, err := result.RowsAffected() 
  8. if err != nil { 
  9.     fmt.Println("受影响行数获取失败:", err) 
  10.     return 
  11. fmt.Println("受影响的行数:", row_affect) 
  12.  
  13. fmt.Println("删除成功"

执行结果

Mysql


事物

代码

  1. //事物 
  2. tx, err := db.Begin() 
  3. if err != nil { 
  4.     //释放事物 
  5.     if tx != nil { 
  6.         tx.Rollback() 
  7.     fmt.Println("事物开启失败"
  8.     return 
  9. 张三减10块Sql := `UPDATE bill set money=money - 10 where name = ?;` 
  10. result, err := tx.Exec(张三减10块Sql, "张三"
  11. if err != nil { 
  12.     //有错误表示更是失败,回滚原来状态 
  13.     tx.Rollback() 
  14.     fmt.Println(err) 
  15.     return 
  16. 张三受影响行数, err := result.RowsAffected() 
  17. if err != nil { 
  18.     tx.Rollback() // 回滚 
  19.     return 
  20.  
  21. 李四加10块Sql := `UPDATE bill set money=money + 10 where name = ?;` 
  22. result, err = tx.Exec(李四加10块Sql, "李四"
  23. if err != nil { 
  24.     //有错误表示更是失败,回滚原来状态 
  25.     tx.Rollback() 
  26.     fmt.Println(err) 
  27.     return 
  28. 李四受影响行数, err := result.RowsAffected() 
  29. if err != nil { 
  30.     tx.Rollback() // 回滚 
  31.     return 
  32. //都等于1表示成功,可以提交事务,修改数据 
  33. if 张三受影响行数==1 && 李四受影响行数==1{ 
  34.     //提交事务 
  35.     fmt.Println("提交事务"
  36.     tx.Commit() 
  37. }else
  38.     //有一个!=1表示没有更新成功,可能用户不存在 
  39.     fmt.Println("失败了,事物回滚了"
  40.     tx.Rollback() 
  41. fmt.Println("事物执行成功"

执行结果

 

Mysql

 

NameExec

做增 删 改使用。

NameExec方法是通过结构体或Map绑定SQL语句,试了试,感觉用处不大,不做举例。

NameQuery

做查询使用。

用法同上,没用,不做举例。

总结

其实sqlx模块,最大的改进是在查询方面,相信你也看到了,确实会比原生查询方便很多很多。

但是在其他方便,就显得捉襟见肘了,但是又说,一般还是查询场景多,查多改少。

 

责任编辑:姜华 来源: Go语言进阶学习
相关推荐

2011-01-05 11:12:34

C++

2023-09-03 19:43:46

htmxJavaScript网络

2013-05-15 09:14:01

2011-09-15 14:00:52

IOS应用SpoolInstapaper

2022-09-21 10:50:43

pickledillPython

2011-05-26 17:55:08

2009-01-05 10:30:23

赛门铁克Veritas数据中心

2023-05-10 08:17:22

合并事件推送

2009-12-29 14:18:43

ADO.NET2.0

2020-07-02 16:20:36

MySQLCURD数据库

2022-10-08 08:15:55

GScriptGo 语言

2015-09-23 11:27:20

Office 2016ISO镜像微软

2024-01-07 19:54:51

2013-08-20 17:46:43

通达OA

2021-01-23 12:47:19

MySQL数据库Go语言

2023-04-06 08:27:47

SidecarSet容器

2013-10-09 14:57:41

通达oa

2012-08-28 13:37:30

2010-08-25 10:42:20

GroovyGroovy++

2023-04-04 07:25:46

KubernetesOpenKruise
点赞
收藏

51CTO技术栈公众号