1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Go語言增強(qiáng)版操作Mysql(Sqlx)

        共 5335字,需瀏覽 11分鐘

         ·

        2021-01-28 20:37

        點(diǎn)擊上方“Go語言進(jìn)階學(xué)習(xí)”,進(jìn)行關(guān)注

        回復(fù)“Go語言”即可獲贈從入門到進(jìn)階共10本電子書

        春城無處不飛花,寒食東風(fēng)御柳斜。

        前言

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

        但是相對來說,還有有點(diǎn)復(fù)雜的,可能那些大佬也都覺得繁瑣叭。

        就又開發(fā)出了增強(qiáng)版查詢Mysql操作庫Sqlx


        mod文件

        go.mod

        module sqlxDemo
        go 1.14
        require ( github.com/go-sql-driver/mysql v1.4.0 github.com/jmoiron/sqlx v1.2.0 google.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ù)庫

        代碼

        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 連接,會驗(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)}

        查詢單條

        我記得使用原來的方式進(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)體扔過去,就綁定成功了。

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

        查詢多條

        還是慣例,看看原來是怎么查的。

        //查詢多條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, 010)for rows.Next() {    var user Userinfo    err = rows.Scan(&user.Id, &user.Name, &user.Phone, &user.Address)    //處理err    userList = append(userList, user)}fmt.Println(userList)

        為了方便,我去掉了err,使用偽代碼處理err代替。

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


        來看看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é)果

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

        添加

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

        代碼

        //添加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("事物開啟失敗")    return}張三減10塊Sql := `UPDATE bill set money=money - 10 where name = ?;`result, err := tx.Exec(張三減10塊Sql, "張三")if err != nil {    //有錯(cuò)誤表示更是失敗,回滾原來狀態(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ò)誤表示更是失敗,回滾原來狀態(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表示沒有更新成功,可能用戶不存在 fmt.Println("失敗了,事物回滾了") tx.Rollback()}fmt.Println("事物執(zhí)行成功")

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

        Mysql

        NameExec

        增 刪 改使用。

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

        NameQuery

        做查詢使用。

        用法同上,沒用,不做舉例。

        總結(jié)

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

        但是在其他方便,就顯得捉襟見肘了,但是又說,一般還是查詢場景多,查多改少。

        如果在操作過程中有任何問題,記得下面留言,我們看到會第一時(shí)間解決問題。

        乾坤未定,你我皆是黑馬。

        我是碼農(nóng)星期八,如果覺得還不錯(cuò),記得動手點(diǎn)贊一下哈。

        感謝你的觀看。

        如果你覺得文章還可以,記得點(diǎn)贊留言支持我們哈。感謝你的閱讀,有問題請記得在下方留言噢~

        想學(xué)習(xí)更多關(guān)于Python的知識,可以參考學(xué)習(xí)網(wǎng)址:http://pdcfighting.com/,點(diǎn)擊閱讀原文,可以直達(dá)噢~

        -------------------?End?-------------------

        往期精彩文章推薦:

        歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

        想加入Go學(xué)習(xí)群請?jiān)诤笈_回復(fù)【入群

        萬水千山總是情,點(diǎn)個(gè)【在看】行不行

        瀏覽 38
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            世界二级毛片国语 | 天天撸夜夜操 | 欧美AAAAAAAAAA特级 | 国产精品亚洲欧美婷婷五月 | 日韩精品一区二区三区在线播放 | 日本在线久 | 少妇放荡的呻吟干柴烈火动态图 | 插进来综合 | 欧美性猛交XXXX乱大交久久 | 极品另类 |