使用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

posted @ 2020-04-19 12:52  lin_zone  阅读(2799)  评论(0编辑  收藏  举报