国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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ò)

2013-05-15 09:14:01

2011-09-15 14:00:52

IOS應(yīng)用SpoolInstapaper

2022-09-21 10:50:43

pickledillPython

2011-05-26 17:55:08

2009-01-05 10:30:23

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

2023-05-10 08:17:22

合并事件推送

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ǔ)言

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

2012-08-28 13:37:30

點(diǎn)贊
收藏

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

久久av免费观看| 欧美日韩精品免费观看视完整| 国模少妇一区二区三区| 欧美精品一区二| www.在线播放| 亚洲综合免费观看高清在线观看| 400部精品国偷自产在线观看| 欧美日韩中文一区二区| 在线不卡a资源高清| 91福利在线免费| 在线观看视频一区| 欧美精品少妇| 色激情天天射综合网| 最近中文字幕2019第二页视频| 亚洲国产一区二区在线播放| 91亚洲免费视频| 午夜久久久久久| 中文字幕在线视频网| 国产日韩一区二区三区在线播放| 日韩欧美精品久久| 久草精品在线观看| 成人三级av| 亚洲超碰97人人做人人爱| 凹凸国产熟女精品视频| 激情久久婷婷| 国产精品久久久久久久9999| 国产一区久久精品| 男人的天堂成人在线| 国产日韩久久| 二区三区精品| 免费成人在线网站| 日韩欧美黄色大片| 亚洲美女又黄又爽在线观看| 99精品国产在热久久| 日韩写真在线| 高清国产在线一区| 欧美日韩你懂得| 激情六月综合| 色网站免费在线观看| 亚洲午夜精品久久久久久性色| 在线看日韩欧美| 免费看成人哺乳视频网站| 波多野结衣在线| 琪琪亚洲精品午夜在线| 日本一区二区三区中文字幕 | 国产日韩欧美不卡在线| 性欧美孕妇孕交| 欧美激情视频网| 日本道精品一区二区三区| 亚洲一区二区三区高清不卡| 日本三级福利片| 欧美精品一区二区三区一线天视频| 最新国产一区| 超碰影院在线观看| www.国产在线播放| 四虎免费av| 四虎在线观看| 日本在线观看免费视频| 久久亚洲国产精品| 亚洲成人动漫av| 日韩久久一区| 欧美激情奇米色| av综合网站| 久久爱av电影| 亚洲欧美一区二区久久| 蜜桃视频网站在线观看| 欧美激情在线观看| 国产不卡视频在线播放| 88xx成人网| 自拍偷拍亚洲欧美日韩| 亚洲精品国产setv| 台湾佬中文娱乐久久久| 久草免费在线| 成视人a免费观看视频| 国产99午夜精品一区二区三区 | 久cao在线| 色视频在线免费观看| 国产美女免费观看| 妞干网在线视频| av在线不卡播放| 最新中文字幕在线| av免费不卡国产观看| 性感美女一区二区在线观看| 欧美视频精品| 日韩欧美一级| 西野翔中文久久精品国产| av在线免费网址| 欧美h版电影| 岛国大片在线播放| 51国偷自产一区二区三区| 欧美成人精品在线视频| 欧美在线一二三| 亚洲图片欧美色图| 丰满岳乱妇一区二区三区| 亚洲综合不卡| 亚洲另类春色校园小说| 91精品尤物| 91九色综合| 成人资源在线播放| 欧美jizzhd精品欧美巨大免费| 999精品一区| 欧美精选一区| 欧美午夜精品一区二区三区电影| av2020不卡| 初尝黑人巨炮波多野结衣电影| 免费看欧美黑人毛片| 国产日韩视频在线播放| 欧美极品在线播放| 日韩一区二区电影在线| 国产精品三级视频| 中文字幕日韩一区二区| www.性欧美| 日本色综合中文字幕| 欧美gv在线| 亚洲综合图片| 免费一区二区三区在线观看| 亚洲综合五月天| 超碰97网站| 国产精品久久波多野结衣| 国产欧美丝袜| 免费网站永久免费观看| 992tv在线观看在线播放| 国产视色精品亚洲一区二区| a级黄色片网站| 伊人久久在线观看| 中文天堂av| 亚洲一区二区三区久久久| 激情综合色综合久久| 国产精品国产三级国产普通话三级| 国产精品久久久久久久浪潮网站| 亚洲影院天堂中文av色| 亚洲激情网址| 波多野结衣在线观看一区二区三区 | 亚洲精品久久久中文字幕| 日本在线视频1区| 免费高潮视频95在线观看网站| 美女亚洲一区| 国产麻豆一精品一av一免费| 国产在线视视频有精品| 日韩一区二区在线观看| 国产精品美女www爽爽爽视频| 精品日产一区2区三区黄免费| 青青草精品视频在线| 在线中文字幕av| av网站免费| 免费全黄无遮挡裸体毛片| 免费在线你懂的| 国产精品美女久久久久人| 伊人久久噜噜噜躁狠狠躁| 最近最新中文字幕在线| 91社区在线观看| 成人免费一区| 亚洲美女啪啪| 精品久久久久久久大神国产| 精品福利在线观看| 精品小视频在线| 日本高清不卡三区| 日韩亚洲视频在线| 日韩精品在在线一区二区中文| 亚洲男男gay视频| h1515四虎成人| 欧美尤物美女在线| 欧美日韩一区在线视频| 中文字幕欧美日韩在线| 亚洲图片欧美色图| 精品无人码麻豆乱码1区2区 | 永久免费看mv网站入口亚洲| 亚洲日本在线a| 日本女优在线视频一区二区 | 97在线视频一区| 欧美一区二区三级| 中文乱码免费一区二区| 免费日韩精品中文字幕视频在线| 中文字幕视频精品一区二区三区| 免费在线你懂的| 秋霞在线观看av| 欧美国产日韩激情| 国产精品一区二区三区四区五区| 欧美成人高清视频| 精品国产乱码久久久久久夜甘婷婷 | 亚洲激情视频网站| 亚洲黄色录像片| 成人小视频在线观看| 亚洲欧美网站在线观看| 久久国产精品美女| 免费不卡av| 国产区av在线| 成人三级av| 少妇高潮毛片色欲ava片| 国产精品一区二区三区免费视频| 亚洲午夜女主播在线直播| 欧美影视一区在线| 亚洲三级视频在线观看| 不卡高清视频专区| 久久国产精品亚洲77777| 欧美aaaa视频| 另类图片第一页| 国产精品久久久久久吹潮| 影音先锋中文在线视频| 飘雪影视在线观看免费观看|