zoukankan      html  css  js  c++  java
  • 使用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/cache/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

  • 相关阅读:
    *Binary Tree Inorder Traversal
    First Unique Character in a String
    回溯法模板
    *Linked List Random Node
    *Odd Even Linked List
    *Maximum Product of Word Lengths
    Flatten 2D Vector
    Docker (dockerfile)
    Docker数据卷
    Docker入门
  • 原文地址:https://www.cnblogs.com/zhuchenglin/p/12731078.html
Copyright © 2011-2022 走看看