Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式
本文演示在Gin框架中通過三種方式實現(xiàn)增刪改查的操作,數(shù)據(jù)表結(jié)構(gòu)如下:
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `user_no` bigint(20) unsigned NOT NULL COMMENT '用戶編號', `name` varchar(255) NOT NULL DEFAULT '' COMMENT '用戶姓名', `age` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '用戶年齡', `address` varchar(255) NOT NULL DEFAULT '' COMMENT '地址', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間', `update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', PRIMARY KEY (`id`), UNIQUE KEY `key_user_no` (`user_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
原生SQL操作
在Gin框架中使用MySQL的最簡單的方式就是直接處理SQL語句,記得引入 _ "github.com/go-sql-driver/mysql"
。
代碼如下:
//公共方法封裝 package dbUtil import ( "database/sql" "fmt" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "net/http" "strconv" ) var tableName = "users" //數(shù)據(jù)表名 var result ResponseData //響應結(jié)果數(shù)據(jù) // 統(tǒng)一返回數(shù)據(jù)的結(jié)構(gòu)體 type ResponseData struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data"` } func showSuccess(c *gin.Context, data interface{}) { result.Code = http.StatusOK result.Message = "操作成功" result.Data = data c.JSON(http.StatusOK, result) return } func showError(c *gin.Context, message string) { result.Code = http.StatusBadRequest result.Message = message result.Data = nil c.JSON(http.StatusOK, result) return } // 使用原生SQL語句 // go-sql-driver地址:https://github.com/go-sql-driver/mysql var sqlDb *sql.DB //數(shù)據(jù)庫連接db // 初始化 func init() { //打開數(shù)據(jù)庫 //parseTime:時間格式轉(zhuǎn)換(查詢結(jié)果為時間時,是否自動解析為時間); //loc=Local:MySQL的時區(qū)設置 sqlStr := "root:rx123456@tcp(127.0.0.1:3306)/gin_demo?charset=utf8&parseTime=true&loc=Local" var err error sqlDb, err = sql.Open("mysql", sqlStr) if err != nil { fmt.Println("數(shù)據(jù)庫打開失?。?, err) return } //測試與數(shù)據(jù)庫建立的連接,非必要(校驗連接是否正確) err = sqlDb.Ping() if err != nil { fmt.Println("數(shù)據(jù)庫連接失?。?, err) return } } // 用戶結(jié)構(gòu)體 type sqlUserData struct { Id int `json:"id"` UserNo int `json:"user_no"` Name string `json:"name"` Age int `json:"age"` Address string `json:"address"` Remarks string `json:"remarks"` } func MysqlInsertData(c *gin.Context) { /* //請求參數(shù) { "user_no":1001, "name":"張三", "age":18, "address":"北京昌平" } */ var user sqlUserData err := c.Bind(&user) if err != nil { showError(c, fmt.Sprint(err)) return } sqlStr := "insert into " + tableName + "(user_no, name, age, address) values (?,?,?,?)" ret, err := sqlDb.Exec(sqlStr, user.UserNo, user.Name, user.Age, user.Address) if err != nil { fmt.Printf("insert failed, err:%v\n", err) showError(c, fmt.Sprint(err)) return } newDataId, _ := ret.LastInsertId() showSuccess(c, "新增的結(jié)果id:"+strconv.Itoa(int(newDataId))) }
func MysqlGetUserList(c *gin.Context) { name := c.Query("name") sqlStr := "select id,user_no,name,age,address from " + tableName + " where name=?" rows, err := sqlDb.Query(sqlStr, name) if err != nil { showError(c, fmt.Sprint(err)) return } defer rows.Close() userList := make([]sqlUserData, 0) for rows.Next() { var user sqlUserData rows.Scan(&user.Id, &user.UserNo, &user.Name, &user.Age, &user.Address) if user.Age >= 18 { user.Remarks = "已成年" } else { user.Remarks = "未成年" } userList = append(userList, user) } showSuccess(c, userList) }
func MysqlGetUserInfo(c *gin.Context) { id := c.Query("id") sqlStr := "select id,user_no,name,age,address from " + tableName + " where id=?" var user sqlUserData err := sqlDb.QueryRow(sqlStr, id).Scan(&user.Id, &user.UserNo, &user.Name, &user.Age, &user.Address) if err != nil { showError(c, fmt.Sprint(err)) return } showSuccess(c, user) }
func MysqlUpdateData(c *gin.Context) { /* //請求參數(shù) { "id":1, "age":13, "address":"河北" } */ var user sqlUserData err := c.Bind(&user) if err != nil { showError(c, fmt.Sprint(err)) return } sqlStr := "update " + tableName + " set age=? ,address=? where id=?" ret, err := sqlDb.Exec(sqlStr, user.Age, user.Address, user.Id) if err != nil { fmt.Printf("update failed, err:%v\n", err) showError(c, fmt.Sprint(err)) return } res, _ := ret.RowsAffected() showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(res))) }
func MysqlDeleteData(c *gin.Context) { id := c.Query("id") var count int //先查詢 sqlStr := "select count(*) from " + tableName + " where id=?" err := sqlDb.QueryRow(sqlStr, id).Scan(&count) if count <= 0 || err != nil { showError(c, "數(shù)據(jù)不存在") return } //再刪除 delStr := "delete from " + tableName + " where id=?" ret, err := sqlDb.Exec(delStr, id) if err != nil { fmt.Printf("delete failed, err:%v\n", err) showError(c, fmt.Sprint(err)) return } res, _ := ret.RowsAffected() showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(res))) }
XORM
xorm是一個Go語言的ORM庫,通過它可以很方便的操作數(shù)據(jù)庫。它的設計重點是高性能和易用性。XORM支持多種數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite、Oracle和SQL Server,并提供了豐富的查詢語言。XORM還支持事務和緩存機制,可以提高數(shù)據(jù)庫操作的性能。添加依賴:go get github.com/go-xorm/xorm
ORM,即pobject-RelationlMapping,它的作用是在關(guān)系型數(shù)據(jù)庫和對象之間作一個映射,這樣我們在具體操作數(shù)據(jù)庫的時候,就不需要再去和復雜的SQL語句打交道,只要像平時操作對象一樣操作它就可以了。
比較好的Go語言ORM包括:xorm與gorm
下面是代碼實現(xiàn):
package dbUtil import ( "fmt" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" "strconv" "time" ) var myXorm *xorm.Engine // 定義結(jié)構(gòu)體(xorm支持雙向映射);如果表不存在,則會自動創(chuàng)建 type users struct { Id int64 `xorm:"pk autoincr" json:"id"` //指定主鍵并自增 UserNo int `xorm:"unique" json:"user_no"` Name string `json:"name"` Age int `json:"age"` Address string `json:"address"` CreateTime time.Time `xorm:"created" json:"create_time"` UpdateTime time.Time `xorm:"updated" json:"update_time"` } func init() { sqlStr := "root:rx123456@tcp(127.0.0.1:3306)/gin_demo?charset=utf8&parseTime=true&loc=Local" var err error //創(chuàng)建數(shù)據(jù)庫引擎 myXorm, err = xorm.NewEngine("mysql", sqlStr) if err != nil { fmt.Println("數(shù)據(jù)庫連接失敗:", err) } //創(chuàng)建或者同步表,表名稱是users //如果數(shù)據(jù)表不存在,會根據(jù)users結(jié)構(gòu)體自動創(chuàng)建 err = myXorm.Sync(new(users)) if err != nil { fmt.Println("數(shù)據(jù)表同步失敗:", err) } } func XormGetUserList(c *gin.Context) { name := c.Query("name") var user []users err := myXorm.Where("name=?", name).And("age>20").Limit(10, 0).Asc("age").Find(&user) if err != nil { showError(c, fmt.Sprint(err)) return } showSuccess(c, user) } func XormGetUserInfo(c *gin.Context) { id := c.Query("id") var user []users err := myXorm.Where("id=?", id).Find(&user) if err != nil { showError(c, fmt.Sprint(err)) return } if len(user) == 0 { showSuccess(c, nil) } showSuccess(c, user[0]) } func XormInsertData(c *gin.Context) { /* //請求參數(shù) { "user_no":1001, "name":"張三", "age":18, "address":"北京昌平" } */ var user users err := c.Bind(&user) if err != nil { showError(c, fmt.Sprint(err)) return } affected, err := myXorm.Insert(user) if err != nil || affected <= 0 { fmt.Printf("insert failed, err:%v\n", err) showError(c, fmt.Sprint(err)) return } showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(affected))) } func XormUpdateData(c *gin.Context) { /* //請求參數(shù) { "id":1, "age":13, "address":"河北" } */ var u users err := c.Bind(&u) if err != nil { showError(c, fmt.Sprint(err)) return } //先查找 var user []users err = myXorm.Where("id=?", u.Id).Find(&user) //fmt.Println(myXorm.NewSession().LastSQL()) if err != nil { showError(c, fmt.Sprint(err)) return } if len(user) == 0 { showError(c, "數(shù)據(jù)不存在") return } //再修改 affected, err := myXorm.Where("id=?", u.Id).Update(&users{ Age: u.Age, Address: u.Address, }) if err != nil { showError(c, fmt.Sprint(err)) return } showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(affected))) } func XormDeleteData(c *gin.Context) { id := c.Query("id") //先查找 var user []users err := myXorm.Where("id=?", id).Find(&user) if err != nil { showError(c, fmt.Sprint(err)) return } if len(user) == 0 { showError(c, "數(shù)據(jù)不存在") return } //再刪除 affected, err := myXorm.Where("id=?", id).Delete(&users{}) if err != nil { showError(c, fmt.Sprint(err)) return } showSuccess(c, "受影響的行數(shù):"+strconv.Itoa(int(affected))) }
GORM
GORM是Go語言中最受歡迎的ORM框架之一。它具有易于使用的API和靈活的查詢語言,支持多種類型的數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite和SQL Server。GORM還提供了自動遷移功能,可以在應用程序啟動時自動創(chuàng)建數(shù)據(jù)庫表和字段。
使用方法:添加依賴 go get gorm.io/gorm
和 go get gorm.io/driver/mysql
實現(xiàn)代碼如下:
package dbUtil import ( "fmt" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" "gorm.io/gorm" "time" ) var gormDB *gorm.DB // 定義結(jié)構(gòu)體 // 特別注意:結(jié)構(gòu)體名稱為:user,創(chuàng)建的表的名稱為:users type user struct { Id int `gorm:"primaryKey;autoIncrement" json:"id"` //指定主鍵并自增 UserNo int `gorm:"unique" json:"user_no"` Name string `gorm:"type:varchar(256);not null" json:"name"` Age int `gorm:"type:tinyint(4);not null" json:"age"` Address string `gorm:"type:varchar(256);not null" json:"address"` CreateTime time.Time `json:"create_time"` UpdateTime time.Time `json:"update_time"` } func init() { var err error sqlStr := "root:rx123456@tcp(127.0.0.1:3306)/gin_demo?charset=utf8mb4&parseTime=true&loc=Local" gormDB, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{}) //配置項中預設了連接池 ConnPool if err != nil { fmt.Println("數(shù)據(jù)庫連接出錯:", err) return } } // 捕獲異常 func catchException(c *gin.Context) { err := recover() if err != nil { showError(c, fmt.Sprint(err)) } } func GormGetUserList(c *gin.Context) { defer func() { catchException(c) }() name := c.Query("name") myUser := make([]user, 10) tx := gormDB.Where("name=?", name).Find(&myUser).Limit(10) //查詢到的有可能為多行,所以采用結(jié)構(gòu)體切片 if tx.Error != nil { showError(c, fmt.Sprint(tx.Error)) return } showSuccess(c, myUser) } func GormGetUserInfo(c *gin.Context) { defer func() { catchException(c) }() id := c.Query("id") myUser := user{} tx := gormDB.Where("id=?", id).First(&myUser) if tx.Error != nil { showError(c, fmt.Sprint(tx.Error)) return } showSuccess(c, myUser) } func GormInsertData(c *gin.Context) { /* //請求參數(shù) { "user_no":1001, "name":"張三", "age":18, "address":"北京昌平" } */ defer func() { catchException(c) }() var myUser user err := c.Bind(&myUser) if err != nil { showError(c, fmt.Sprint(err)) } fmt.Println("myUser", myUser) tx := gormDB.Create(&myUser) fmt.Println(tx) if tx.RowsAffected > 0 { showSuccess(c, tx.RowsAffected) return } else { fmt.Printf("insert failed, err:%v\n", err) showError(c, fmt.Sprint(tx.Error)) } } func GormUpdateData(c *gin.Context) { /* //請求參數(shù) { "id":1, "age":13, "address":"河北" } */ defer func() { catchException(c) }() var myUser user err := c.Bind(&myUser) if err != nil { showError(c, fmt.Sprint(err)) } fmt.Println("myUser", myUser) //先查找 var count int64 gormDB.Model(&user{}).Where("id=?", myUser.Id).Count(&count) if count == 0 { showError(c, "數(shù)據(jù)不存在") return } //再更新 tx := gormDB.Model(&user{}).Where("id=?", myUser.Id).Updates(&myUser) fmt.Println(tx) //打印結(jié)果 if tx.RowsAffected > 0 { showSuccess(c, tx.RowsAffected) } else { showError(c, fmt.Sprint(tx.Error)) } } func GormDeleteData(c *gin.Context) { defer func() { catchException(c) }() id := c.Query("id") //先查找 var count int64 gormDB.Model(&user{}).Where("id=?", id).Count(&count) if count == 0 { showError(c, "數(shù)據(jù)不存在") return } //再刪除 tx := gormDB.Where("id=?", id).Delete(&user{}) fmt.Println(tx) //打印結(jié)果 if tx.RowsAffected > 0 { showSuccess(c, tx.RowsAffected) } else { showError(c, fmt.Sprint(tx.Error)) } }
GORM和XORM都是優(yōu)秀的ORM框架,它們之間的一些區(qū)別:
- 查詢語言:GORM使用鏈式查詢語法,而XORM使用結(jié)構(gòu)體作為查詢條件。XORM的查詢語言更為靈活,可以支持更復雜的查詢。
- 性能:XORM的性能比GORM更高,在大量數(shù)據(jù)的情況下,XORM能夠更快地進行數(shù)據(jù)庫操作。
- 易用性:GORM的API比XORM更易用,特別是對于沒有ORM經(jīng)驗的開發(fā)者來說。
- 社區(qū)支持:GORM的社區(qū)比XORM更大,因此有更多的文檔、示例和插件可以使用。
到此這篇關(guān)于Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式的文章就介紹到這了,更多相關(guān)Gin框架使用MySQL數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用gorm.Scopes函數(shù)實現(xiàn)復用查詢邏輯示例
這篇文章主要為大家介紹了使用gorm.Scopes函數(shù)實現(xiàn)復用查詢邏輯示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)
在golang中并沒有提供內(nèi)置函數(shù)來獲取變量的類型,但是通過一定的方式也可以獲取,下面這篇文章主要給大家介紹了關(guān)于golang獲取變量或?qū)ο箢愋偷膸追N方式,需要的朋友可以參考下2022-12-12Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine)
本文主要介紹了Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05