使用Golang 封裝一個Api 框架 ----- 數據庫操作篇(gorm引入)


前言:

一個框架中沒有數據庫操作是萬萬不能的,本框架暫時先引入gorm,后續如果gorm使用不順手的話,就需要考慮基於Golang數據庫驅動自己造輪子了

  1. 引入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				// 重新安裝
    
  2. 獲取 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]
    }
    

    在這個文件中定義了一個變量,里面存儲數據庫的相關配置,下面獲取所有數據庫配置和單個配置的方法

  3. 定義Model

    1. 在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 后,函數退出前。如果將釋放數據庫連接的操作寫在獲取數據庫連接的方法中,將導致此連接還沒用就會被釋放

    2. 在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()
      }
      
  4. 在控制器中使用

    在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM