Go語(yǔ)言增強(qiáng)版操作Mysql(Sqlx)
回復(fù)“Go語(yǔ)言”即可獲贈(zèng)從入門(mén)到進(jìn)階共10本電子書(shū)
前言
上次咱們學(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
module sqlxDemogo 1.14require (github.com/go-sql-driver/mysql v1.4.0github.com/jmoiron/sqlx v1.2.0google.golang.org/appengine v1.6.7 // indirect)
創(chuàng)建數(shù)據(jù)表
創(chuàng)建表代碼
CREATE TABLE `userinfo` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) DEFAULT NULL,`phone` char(11) DEFAULT NULL,`address` varchar(64) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
創(chuàng)建結(jié)構(gòu)體
結(jié)構(gòu)體代碼
type Userinfo struct {Id int64 `json:"id"`Name string `json:"name"`Phone string `json:"phone"`Address string `json:"address"`}
連接數(shù)據(jù)庫(kù)
代碼
import ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx")type Userinfo struct {Id int64 `json:"id"`Name string `json:"name"`Phone string `json:"phone"`Address string `json:"address"`}func main() {dsn := "root:rootroot@tcp(127.0.0.1:3306)/go_mysql_demo?charset=utf8mb4&parseTime=True"// 使用 MustConnect 連接的話,驗(yàn)證失敗不成功直接panic//db := sqlx.MustConnect("mysql", dsn)//使用 Connect 連接,會(huì)驗(yàn)證是否連接成功,db, err := sqlx.Connect("mysql", dsn)if err != nil {fmt.Printf("connect DB failed, err:%v\n", err)return}db.SetMaxOpenConns(20)db.SetMaxIdleConns(10)}
查詢單條
我記得使用原來(lái)的方式進(jìn)行查詢并且綁定結(jié)構(gòu)體,是這審的。
//查詢單條sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;"var user Userinfoerr = db.QueryRow(sqlStr, 1).Scan(&user.Id, &user.Name, &user.Phone, &user.Address)if err != nil {fmt.Println("查詢失敗", err)return}
看第4行代碼,需要將結(jié)構(gòu)體的字段一個(gè)一個(gè)點(diǎn)上去。
如果使用sqlx呢?
代碼
//查詢sqlStr := "SELECT id,`name`,phone,address from userinfo where id = ?;"var user Userinfoerr = db.Get(&user, sqlStr, 1)if err != nil {fmt.Println("查詢失敗:", err)return}fmt.Println("user:",user)
執(zhí)行結(jié)果

還是第4行代碼,直接一個(gè)結(jié)構(gòu)體扔過(guò)去,就綁定成功了。
如果表有很多字段,結(jié)構(gòu)體字段也有很多,這個(gè)是很有用的。
查詢多條
還是慣例,看看原來(lái)是怎么查的。
//查詢多條sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?"//參數(shù)同 QueryRowrows, err := db.Query(sqlStr, 1)//處理err// 此處使用rows釋放所有鏈接defer rows.Close()//循環(huán)整理所有數(shù)據(jù)var userList = make([]Userinfo, 0, 10)for rows.Next() {var user Userinfoerr = rows.Scan(&user.Id, &user.Name, &user.Phone, &user.Address)//處理erruserList = append(userList, user)}fmt.Println(userList)
為了方便,我去掉了err,使用偽代碼處理err代替。
原來(lái)的方法,查詢出來(lái)還得需要一個(gè)循環(huán),還需要一個(gè)切片,乖乖嘞,打擾了。
來(lái)看看sqlx
代碼
//查詢多條sqlStr := "SELECT id,`name`,phone,address from userinfo where id >= ?"var userList []Userinfoerr = db.Select(&userList, sqlStr, 1)if err != nil {fmt.Println("查詢失敗:", err)return}fmt.Println("userList:",userList)
執(zhí)行結(jié)果

還是直接扔過(guò)去,就綁定完成了,真是美滋滋。
添加
額,添加,更新,刪除,事物的話,似乎跟原來(lái)差不多,直接看代碼叭。
代碼
//添加sqlStr := "INSERT into userinfo(name,phone,address) values(?,?,?);"result, err := db.Exec(sqlStr, "吳彥祖", 555, "不知道哪的")if err != nil {fmt.Println("插入失敗", err)return}row_affect, err := result.RowsAffected()if err != nil {fmt.Println("受影響行數(shù)獲取失敗:", err)return}fmt.Println("受影響的行數(shù):", row_affect)lastId, err := result.LastInsertId()if err != nil {fmt.Println("新增行id獲取失敗:", err)return}fmt.Println("新增行id:", lastId)fmt.Println("插入成功")
執(zhí)行結(jié)果

Mysql

更新
代碼
//更新數(shù)據(jù)sqlStr := `UPDATE userinfo set name=? where id=?;`result, err := db.Exec(sqlStr, "吳彥祖666", 4)if err != nil {fmt.Println("更新失敗", err)return}//受影響的行數(shù)row_affect, err := result.RowsAffected()if err != nil {fmt.Println("受影響行數(shù)獲取失敗:", err)return}fmt.Println("受影響的行數(shù):", row_affect)fmt.Println("更新成功")
執(zhí)行結(jié)果

Mysql

刪除
代碼
sqlStr := "delete from userinfo where id = ?;"result, err := db.Exec(sqlStr, 4)if err != nil {fmt.Println("刪除失敗", err)return}//受影響的行數(shù)row_affect, err := result.RowsAffected()if err != nil {fmt.Println("受影響行數(shù)獲取失敗:", err)return}fmt.Println("受影響的行數(shù):", row_affect)fmt.Println("刪除成功")
執(zhí)行結(jié)果

Mysql

事物
代碼
//事物tx, err := db.Begin()if err != nil {//釋放事物if tx != nil {tx.Rollback()}fmt.Println("事物開(kāi)啟失敗")return}張三減10塊Sql := `UPDATE bill set money=money - 10 where name = ?;`result, err := tx.Exec(張三減10塊Sql, "張三")if err != nil {//有錯(cuò)誤表示更是失敗,回滾原來(lái)狀態(tài)tx.Rollback()fmt.Println(err)return}張三受影響行數(shù), err := result.RowsAffected()if err != nil {tx.Rollback() // 回滾return}李四加10塊Sql := `UPDATE bill set money=money + 10 where name = ?;`result, err = tx.Exec(李四加10塊Sql, "李四")if err != nil {//有錯(cuò)誤表示更是失敗,回滾原來(lái)狀態(tài)tx.Rollback()fmt.Println(err)return}李四受影響行數(shù), err := result.RowsAffected()if err != nil {tx.Rollback() // 回滾return}//都等于1表示成功,可以提交事務(wù),修改數(shù)據(jù)if 張三受影響行數(shù)==1 && 李四受影響行數(shù)==1{//提交事務(wù)fmt.Println("提交事務(wù)")tx.Commit()}else{//有一個(gè)!=1表示沒(méi)有更新成功,可能用戶不存在fmt.Println("失敗了,事物回滾了")tx.Rollback()}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)景多,查多改少。
如果在操作過(guò)程中有任何問(wèn)題,記得下面留言,我們看到會(huì)第一時(shí)間解決問(wèn)題。
乾坤未定,你我皆是黑馬。
我是碼農(nóng)星期八,如果覺(jué)得還不錯(cuò),記得動(dòng)手點(diǎn)贊一下哈。
感謝你的觀看。
如果你覺(jué)得文章還可以,記得點(diǎn)贊留言支持我們哈。感謝你的閱讀,有問(wèn)題請(qǐng)記得在下方留言噢~
想學(xué)習(xí)更多關(guān)于Python的知識(shí),可以參考學(xué)習(xí)網(wǎng)址:http://pdcfighting.com/,點(diǎn)擊閱讀原文,可以直達(dá)噢~
-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Go學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
