亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang數據庫操作和不定字段結果查詢的示例分析

發布時間:2021-09-03 13:26:19 來源:億速云 閱讀:174 作者:小新 欄目:開發技術

小編給大家分享一下Golang數據庫操作和不定字段結果查詢的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    一、Mysql數據庫

    為什么要使用數據庫

    • 一開始人手動記錄數據,不能長期保存,追溯;

    • 然后創建了文件系統,能夠長期保存,但是查詢追溯更新麻煩,數據可以發生冗余重復;

    • 實現了數據庫的方式,能夠長期保存,方便查詢,追溯,更新等等一系列操作,能設置一些約束進行數據的自我管控等等。

    簡單介紹下Mysql數據庫的特點:關系型數據庫、體積小、速度快、成本低、開源代碼、中小網站適用、非常適合初學者學習

    二、Golang操作Mysql

    1. 現有test數據庫表格user

    Golang數據庫操作和不定字段結果查詢的示例分析

    2. 連接mysql數據庫

    2.1. 使用到的第三方庫

    github.com/go-sql-driver/mysql(驅動)

    github.com/jmoiron/sqlx(對驅動的操作封裝)

    2.2. 連接
    package main
    
    import (
       "fmt"
       _ "github.com/go-sql-driver/mysql"
       "github.com/jmoiron/sqlx"
    )
    
    func main() {
       db, err := sqlx.Open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4")
       if err != nil {
          fmt.Println("open mysql failed,", err)
       }
       db.SetMaxIdleConns(5) //設置最大的空閑數
       db.SetMaxOpenConns(15) //設置最大的連接數
    }
    
      //db, err := sqlx.Open("數據庫類型", "用戶名:密碼@tcp(地址:端口)/數據庫名")

    3. SELECT數據庫查詢操作

    package main
    
    import (
       "fmt"
       _ "github.com/go-sql-driver/mysql"
       "github.com/jmoiron/sqlx"
    )
    
    var db *sqlx.DB
    
    func initDB() {
       var err error
       db, err = sqlx.Open("mysql", "username:password@(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=true&loc=Local")
       if err != nil {
          fmt.Println("open mysql failed,", err)
       }
       db.SetMaxIdleConns(5)
       db.SetMaxOpenConns(15)
    }
    
    type User struct {
       Id   int64  `db:"id"`
       Name string `db:"name"`
       Age  int64  `db:"age"`
       Sex  string `db:"sex"`
    }
    
    func main() {
       initDB()
       defer db.Close()
    
       var user []User
       sqlStr := "SELECT * FROM user"
       err := db.Select(&user, sqlStr)
       if err != nil {
          fmt.Println(err)
       }
       fmt.Println(user)
    }

    得到結果->

    [{1 張三 20 男} {2 李四 21 女} {3 王五 25 男}]

    4. Insert數據庫插入操作

    package main
    
    import (
       "fmt"
       _ "github.com/go-sql-driver/mysql"
       "github.com/jmoiron/sqlx"
    )
    
    var db *sqlx.DB
    
    func initDB() {
       var err error
       db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
       if err != nil {
          fmt.Println("open mysql failed,", err)
       }
       db.SetMaxIdleConns(5)
       db.SetMaxOpenConns(15)
    }
    
    type User struct {
       Id   int64  `db:"id"`
       Name string `db:"name"`
       Age  int64  `db:"age"`
       Sex  string `db:"sex"`
    }
    
    func main() {
       initDB()
       defer db.Close()
    
       var user = User{
          Name: "小六",
          Age: 18,
          Sex: "女",
       }
    
       sqlStr := "INSERT INTO user(name, age, sex) VALUES (?,?,?)"
       res, err := db.Exec(sqlStr, user.Name, user.Age, user.Sex)
       if err != nil {
          fmt.Println(err)
       }
       c, _ := res.RowsAffected()
       fmt.Println("有多少行被創建", c)
    }

    得到結果->

    有多少行被創建 1

    Golang數據庫操作和不定字段結果查詢的示例分析

    5. Update數據庫更新操作

    package main
    
    import (
       "fmt"
       _ "github.com/go-sql-driver/mysql"
       "github.com/jmoiron/sqlx"
    )
    
    var db *sqlx.DB
    
    func initDB() {
       var err error
       db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
       if err != nil {
          fmt.Println("open mysql failed,", err)
       }
       db.SetMaxIdleConns(5)
       db.SetMaxOpenConns(15)
    }
    
    type User struct {
       Id   int64  `db:"id"`
       Name string `db:"name"`
       Age  int64  `db:"age"`
       Sex  string `db:"sex"`
    }
    
    func main() {
       initDB()
       defer db.Close()
    
       var user = User{
          Id: 4,
          Age: 20,
       }
    
       sqlStr := "UPDATE user SET age=? WHERE id=?"
       res, err := db.Exec(sqlStr, user.Age, user.Id)
       if err != nil {
          fmt.Println(err)
       }
       c, _ := res.RowsAffected()
       fmt.Println("有多少行被更改", c)
    }

    得到結果->

    有多少行被更改 1

    Golang數據庫操作和不定字段結果查詢的示例分析

    6. DELETE數據庫刪除操作

    package main
    
    import (
       "fmt"
       _ "github.com/go-sql-driver/mysql"
       "github.com/jmoiron/sqlx"
    )
    
    var db *sqlx.DB
    
    func initDB() {
       var err error
       db, err = sqlx.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
       if err != nil {
          fmt.Println("open mysql failed,", err)
       }
       db.SetMaxIdleConns(5)
       db.SetMaxOpenConns(15)
    }
    
    type User struct {
       Id   int64  `db:"id"`
       Name string `db:"name"`
       Age  int64  `db:"age"`
       Sex  string `db:"sex"`
    }
    
    func main() {
       initDB()
       defer db.Close()
    
       deleteId := 3
    
       sqlStr := "DELETE FROM user WHERE id=?"
       res, err := db.Exec(sqlStr, deleteId)
       if err != nil {
          fmt.Println(err)
       }
       c, _ := res.RowsAffected()
       fmt.Println("有多少行被刪除", c)
    }

    得到結果->

    有多少行被刪除 1

    Golang數據庫操作和不定字段結果查詢的示例分析

    三、生成動態字段數據庫查詢結果

    在項目中經常會遇到一個問題:在同一個函數中,查詢不同的表格,生成不同的結果,每次都要重新構建結構體

    思路:把結果弄成[]map[string]string類型,這樣就能把查詢得到的數據都填充進去。

    使用的是內置的庫

    database/sql

    package main
    
    import (
       "database/sql"
       "fmt"
       _ "github.com/go-sql-driver/mysql"
    )
    
    var db *sql.DB
    
    func initDB() {
       var err error
       db, err = sql.Open("mysql", "superxon:superxon@(172.20.3.12:3306)/test?charset=utf8mb4")
       if err != nil {
          fmt.Println("open mysql failed,", err)
       }
       db.SetMaxIdleConns(5)
       db.SetMaxOpenConns(15)
    }
    
    func main() {
       initDB()
       defer db.Close()
    
       sqlStr := "SELECT * FROM user" //可以換成其它的查詢語句,可以得到相應的查詢結果,不用每次都去構建存放的結構體
       rows, err := db.Query(sqlStr)
       if err != nil {
          fmt.Println(err)
       }
       defer rows.Close()
    
       //列出所有查詢結果的字段名
       cols, _ := rows.Columns()
    
       //values是每個列的值,這里獲取到byte里
       values := make([][]byte, len(cols))
       //query.Scan的參數,因為每次查詢出來的列是不定長的,用len(cols)定住當次查詢的長度
       scans := make([]interface{}, len(cols))
       //讓每一行數據都填充到[][]byte里面
       for i := range values {
          scans[i] = &values[i]
       }
       res := make([]map[string]string, 0)
       for rows.Next() {
          _ = rows.Scan(scans...)
          row := make(map[string]string)
          for k, v := range values { //每行數據是放在values里面,現在把它挪到row里
             key := cols[k]
             row[key] = string(v)
          }
          res = append(res, row)
       }
       fmt.Println(res)
    }

    得到結果->

    [map[age:20 id:1 name:張三 sex:男] map[age:21 id:2 name:李四 sex:女] map[age:20 id:4 name:小六 sex:女]]

    以上是“Golang數據庫操作和不定字段結果查詢的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    蒙自县| 南平市| 句容市| 绿春县| 东乡| 大理市| 金华市| 萨迦县| 太康县| 阿图什市| 萨嘎县| 太仆寺旗| 泸州市| 牙克石市| 星子县| 通渭县| 河北省| 鹰潭市| 滕州市| 闽侯县| 青浦区| 改则县| 江川县| 兴文县| 临朐县| 顺昌县| 星座| 青川县| 襄樊市| 宿州市| 龙江县| 乃东县| 仁化县| 山阴县| 梓潼县| 杨浦区| 沙坪坝区| 资源县| 乐东| 桂平市| 乐至县|