成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

2022-10-08 08:15:55

GScriptGo 語言

2020-07-02 16:20:36

MySQLCURD數據庫

2015-09-23 11:27:20

Office 2016ISO鏡像微軟

2013-08-20 17:46:43

通達OA

2023-04-06 08:27:47

SidecarSet容器

2021-01-23 12:47:19

MySQL數據庫Go語言

2024-01-07 19:54:51

2013-10-09 14:57:41

通達oa

2012-08-28 13:37:30

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片一级片 | 国产精品视频区 | 日韩一区二区在线播放 | 夜夜操天天艹 | 亚洲一区二区视频 | 黄网站免费观看 | 一区二区三区免费在线观看 | 久久999| 伊人网综合在线 | 精品小视频 | www成人免费视频 | aaaaa毛片 | 久久久国产精品 | 久久99精品久久久久久狂牛 | 第四色狠狠 | 亚洲精品一区二区在线 | 懂色av一区二区三区在线播放 | 超碰在线97国产 | 99在线资源 | 亚洲欧美日本在线 | 91久久久久久久久 | 久久久蜜桃 | 久久国产精品视频 | 日屁网站 | av黄在线观看 | 盗摄精品av一区二区三区 | 色888www视频在线观看 | 日本一本视频 | 亚洲国产成人精品久久 | 97热在线| 国产1区2区 | 亚洲系列第一页 | 天堂在线91 | 日韩乱码在线 | 久久一 | 精品国产一区二区国模嫣然 | 日韩伦理一区二区 | 国产一区免费 | 免费成人高清在线视频 | 一区二区三区在线免费看 | www.天天操 |