您好,登錄后才能下訂單哦!
小編給大家分享一下Golang數據庫操作和不定字段結果查詢的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
為什么要使用數據庫
一開始人手動記錄數據,不能長期保存,追溯;
然后創建了文件系統,能夠長期保存,但是查詢追溯更新麻煩,數據可以發生冗余重復;
實現了數據庫的方式,能夠長期保存,方便查詢,追溯,更新等等一系列操作,能設置一些約束進行數據的自我管控等等。
簡單介紹下Mysql數據庫的特點:關系型數據庫、體積小、速度快、成本低、開源代碼、中小網站適用、非常適合初學者學習
github.com/go-sql-driver/mysql(驅動)
github.com/jmoiron/sqlx(對驅動的操作封裝)
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(地址:端口)/數據庫名")
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 男}]
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
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
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
在項目中經常會遇到一個問題:在同一個函數中,查詢不同的表格,生成不同的結果,每次都要重新構建結構體
思路:把結果弄成[]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數據庫操作和不定字段結果查詢的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。