前言:
一個框架中沒有數據庫操作是萬萬不能的,本框架暫時先引入gorm,后續如果gorm使用不順手的話,就需要考慮基於Golang數據庫驅動自己造輪子了
-
引入gorm
// 在 go.mod 中加入 require github.com/jinzhu/gorm v1.9.12
在引入gorm的時候可能會遇到crypto 這個資源被牆了,拉取不到,這時候需要手動下載gorm安裝,
cd $PATH/pkg/mod/download/golang.org/x/ git clone https://github.com/golang/crypto.git go mod download // 重新安裝
-
獲取 MySQL 配置
關於MySQL的配置 在conf 目錄下定義了一個 配置文件:mysql.go
package conf var mysqlConf = map[string]map[string]string{ "default": { "host": "", "password": "", "port": "", "user": "", "dbname": "", }, } func GetAllMysqlConf() map[string]map[string]string { return mysqlConf } func GetMysqlConf(key string) map[string]string { if key == "" { key = "default" } return mysqlConf[key] }
在這個文件中定義了一個變量,里面存儲數據庫的相關配置,下面獲取所有數據庫配置和單個配置的方法
-
定義Model
-
在models/baseModel 定義了 一個BaseModel對象,在這個對象上定義了 獲取數據庫連接和 釋放數據庫連接的方法
type BaseModel struct { dbConnect *gorm.DB } func (baseModel BaseModel) getDbConnect() *gorm.DB { var err error mysqlConfig := conf.GetMysqlConf("default") fmt.Println(mysqlConfig["user"] + ":" + mysqlConfig["password"] + "@(" + mysqlConfig["host"] + ":" + mysqlConfig["port"] + ")/" + mysqlConfig["dbname"] + "?charset=utf8&parseTime=True&loc=Local") baseModel.dbConnect, err = gorm.Open("mysql", mysqlConfig["user"]+":"+mysqlConfig["password"]+"@("+mysqlConfig["host"]+":"+mysqlConfig["port"]+")/"+mysqlConfig["dbname"]+"?charset=utf8&parseTime=True&loc=Local") //defer baseModel.dbConnect.Close() if err != nil { // 打日志 log.Println("數據庫連接錯誤----", err) return nil } return baseModel.dbConnect } func (baseModel BaseModel) close() { if baseModel.dbConnect != nil { baseModel.dbConnect.Close() } }
在這里沒有用defer 將 釋放數據庫連接的操作寫在 獲取數據庫連接的方法中的原因是 defer操作的執行時機 是在 return 后,函數退出前。如果將釋放數據庫連接的操作寫在獲取數據庫連接的方法中,將導致此連接還沒用就會被釋放。
-
在models/testModel.go中定義測試模型,在下面的 4 中測試控制器中進行使用
type TestModel struct { BaseModel } func (test TestModel) Test() { db := test.getDbConnect() // 獲取連接 if db == nil { fmt.Println("db 連接失敗") } // 查詢語句 rows, err := db.Raw("sql", ...args).Rows() if err != nil { fmt.Println(err) return } // 這個變量對應數據庫中表的字段 var a, b, c, d, e, f string for rows.Next() { rows.Scan(&a, &b, &c, &d, &e, &f) fmt.Println(a, b, c, d, e, f) } defer rows.Close() // 更新語句 db.Exec("sql", ...args) // 根據 db.Error 和 db.RowsAffected 來判斷 釋放執行成功 defer test.close() }
-
-
在控制器中使用
在controller/testController.go 中 直接調用就可以了
type TestController struct { } func (t *TestController) Test(w http.ResponseWriter, r *http.Request) { testModel := models.TestModel{} testModel.Test() fmt.Fprint(w, "this is test.test") }
注:
1. 在測試的時候需要將 測試 控制器的路由注冊好,數據庫的鏈接配置要確保准確無誤
2. 關於數據庫的操作,具體看 gorm文檔
3. 本博客的示例代碼地址:https://github.com/zhuchenglin/goweb
4. 創作不易,如需轉載請注明出處:https://www.cnblogs.com/zhuchenglin/p/12731078.html