自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go語(yǔ)言增強(qiáng)版操作MySQL(SQLX)

數(shù)據(jù)庫(kù) MySQL
上次咱們學(xué)習(xí)了如何使用Go操作Mysql,并且實(shí)現(xiàn)了簡(jiǎn)單的增刪改查。但是相對(duì)來(lái)說(shuō),還有有點(diǎn)復(fù)雜的,可能那些大佬也都覺(jué)得繁瑣叭。就又開(kāi)發(fā)出了增強(qiáng)版查詢Mysql操作庫(kù)Sqlx。

前言

上次咱們學(xué)習(xí)了如何使用Go操作Mysql,并且實(shí)現(xiàn)了簡(jiǎn)單的增刪改查。

但是相對(duì)來(lái)說(shuō),還有有點(diǎn)復(fù)雜的,可能那些大佬也都覺(jué)得繁瑣叭。

就又開(kāi)發(fā)出了增強(qiáng)版查詢Mysql操作庫(kù)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 

創(chuàng)建數(shù)據(jù)表

創(chuàng)建表代碼

  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; 

創(chuàng)建結(jié)構(gòu)體

結(jié)構(gòu)體代碼

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

連接數(shù)據(jù)庫(kù)

代碼

  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 連接的話,驗(yàn)證失敗不成功直接panic 
  13.     //db := sqlx.MustConnect("mysql", dsn) 
  14.  
  15.     //使用 Connect 連接,會(huì)驗(yàn)證是否連接成功, 
  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) 

查詢單條

我記得使用原來(lái)的方式進(jìn)行查詢并且綁定結(jié)構(gòu)體,是這審的。

  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行代碼,需要將結(jié)構(gòu)體的字段一個(gè)一個(gè)點(diǎn)上去。

如果使用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

執(zhí)行結(jié)果


還是第4行代碼,直接一個(gè)結(jié)構(gòu)體扔過(guò)去,就綁定成功了。

如果表有很多字段,結(jié)構(gòu)體字段也有很多,這個(gè)是很有用的。

查詢多條

還是慣例,看看原來(lái)是怎么查的。

  1. //查詢多條 
  2. sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?" 
  3. //參數(shù)同 QueryRow 
  4. rows, err := db.Query(sqlStr, 1) 
  5. //處理err 
  6. // 此處使用rows釋放所有鏈接 
  7. defer rows.Close() 
  8. //循環(huán)整理所有數(shù)據(jù) 
  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代替。

原來(lái)的方法,查詢出來(lái)還得需要一個(gè)循環(huán),還需要一個(gè)切片,乖乖嘞,打擾了。

來(lái)看看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) 

執(zhí)行結(jié)果


還是直接扔過(guò)去,就綁定完成了,真是美滋滋。

添加

額,添加,更新,刪除,事物的話,似乎跟原來(lái)差不多,直接看代碼叭。

代碼

  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("受影響行數(shù)獲取失敗:", err) 
  10.     return 
  11. fmt.Println("受影響的行數(shù):", 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("插入成功"

執(zhí)行結(jié)果


Mysql


更新

代碼

  1. //更新數(shù)據(jù) 
  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. //受影響的行數(shù) 
  8. row_affect, err := result.RowsAffected() 
  9. if err != nil { 
  10.     fmt.Println("受影響行數(shù)獲取失敗:", err) 
  11.     return 
  12. fmt.Println("受影響的行數(shù):", row_affect) 
  13.  
  14. fmt.Println("更新成功"

執(zhí)行結(jié)果

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. //受影響的行數(shù) 
  7. row_affect, err := result.RowsAffected() 
  8. if err != nil { 
  9.     fmt.Println("受影響行數(shù)獲取失敗:", err) 
  10.     return 
  11. fmt.Println("受影響的行數(shù):", row_affect) 
  12.  
  13. fmt.Println("刪除成功"

執(zhí)行結(jié)果

Mysql


事物

代碼

  1. //事物 
  2. tx, err := db.Begin() 
  3. if err != nil { 
  4.     //釋放事物 
  5.     if tx != nil { 
  6.         tx.Rollback() 
  7.     fmt.Println("事物開(kāi)啟失敗"
  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.     //有錯(cuò)誤表示更是失敗,回滾原來(lái)狀態(tài) 
  13.     tx.Rollback() 
  14.     fmt.Println(err) 
  15.     return 
  16. 張三受影響行數(shù), 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.     //有錯(cuò)誤表示更是失敗,回滾原來(lái)狀態(tài) 
  25.     tx.Rollback() 
  26.     fmt.Println(err) 
  27.     return 
  28. 李四受影響行數(shù), err := result.RowsAffected() 
  29. if err != nil { 
  30.     tx.Rollback() // 回滾 
  31.     return 
  32. //都等于1表示成功,可以提交事務(wù),修改數(shù)據(jù) 
  33. if 張三受影響行數(shù)==1 && 李四受影響行數(shù)==1{ 
  34.     //提交事務(wù) 
  35.     fmt.Println("提交事務(wù)"
  36.     tx.Commit() 
  37. }else
  38.     //有一個(gè)!=1表示沒(méi)有更新成功,可能用戶不存在 
  39.     fmt.Println("失敗了,事物回滾了"
  40.     tx.Rollback() 
  41. fmt.Println("事物執(zhí)行成功"

執(zhí)行結(jié)果

 

Mysql

 

NameExec

做增 刪 改使用。

NameExec方法是通過(guò)結(jié)構(gòu)體或Map綁定SQL語(yǔ)句,試了試,感覺(jué)用處不大,不做舉例。

NameQuery

做查詢使用。

用法同上,沒(méi)用,不做舉例。

總結(jié)

其實(shí)sqlx模塊,最大的改進(jìn)是在查詢方面,相信你也看到了,確實(shí)會(huì)比原生查詢方便很多很多。

但是在其他方便,就顯得捉襟見(jiàn)肘了,但是又說(shuō),一般還是查詢場(chǎng)景多,查多改少。

 

責(zé)任編輯:姜華 來(lái)源: Go語(yǔ)言進(jìn)階學(xué)習(xí)
相關(guān)推薦

2011-01-05 11:12:34

C++

2023-09-03 19:43:46

htmxJavaScript網(wǎng)絡(luò)

2011-09-15 14:00:52

IOS應(yīng)用SpoolInstapaper

2022-09-21 10:50:43

pickledillPython

2013-05-15 09:14:01

2009-01-05 10:30:23

賽門鐵克Veritas數(shù)據(jù)中心

2011-05-26 17:55:08

2009-12-29 14:18:43

ADO.NET2.0

2020-07-02 16:20:36

MySQLCURD數(shù)據(jù)庫(kù)

2022-10-08 08:15:55

GScriptGo 語(yǔ)言

2023-05-10 08:17:22

合并事件推送

2015-09-23 11:27:20

Office 2016ISO鏡像微軟

2013-08-20 17:46:43

通達(dá)OA

2024-01-07 19:54:51

2021-01-23 12:47:19

MySQL數(shù)據(jù)庫(kù)Go語(yǔ)言

2023-04-06 08:27:47

SidecarSet容器

2013-10-09 14:57:41

通達(dá)oa

2023-04-04 07:25:46

KubernetesOpenKruise
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)