使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)

摘要:
mysql.gopackageconfvarmysqlConf=map[string]map[string]string{“default”:=conf.GetMysqlConf(“default”)fmt.Println(mysqlConfig[“user”]+“:err=gorm.Open(“mysql”,charset=utf8&

前言:

一个框架中没有数据库操作是万万不能的,本框架暂时先引入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

免责声明:文章转载自《使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c#类库中使用Sessionmac 小程序 helloworld下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

websql的添加和查询

openDatabase 我们可以使用这样简单的一条语句,创建或打开一个本地的数据库对象 vardb =openDatabase('testDB','1.0','Test DB',2*1024*1024); 复制 openDatabase接收五个参数: 数据库名字 数据库版本号 显示名字 数据库保存数据的大小(以字节为单位 ) 回调函数(非必须)...

PostgreSQL物理坏块和文件损坏案例分享

作者简介 王睿操,平安好医数据库架构岗,多年postgresql数据库运维开发工作。曾就职于中国民航信息,迪卡侬。对其他数据库产品也有一定的涉猎。 背景 笔者最近发现很多朋友经常遇到PostgreSQL坏块或者数据混乱的情况,网上中文资料比较少,于是整理了一下笔者遇到各种各样的报错以及解决方案 案例一:物理坏块 逻辑备份时报错 pg_dump: Dumpi...

将excel的.xlsx文件转成数据库文件.db的方法

1.下载好工具SQLite Expert Professional 3 ,晚上有很多,自行百度。 2.打开.xls文件,将文件另存为.csv文件。说明一下: 可以将xls文件看作是数据库里的一个表。所以,表名和.xls文件名称一直,里面的字段,就是.xls文件中的字段。 3.打开SQLite Expert Professional 3,新建一个数据库,数据...

JDBC的URL

JDBC的URL=协议名+子协议名+数据源名。 协议名总是“jdbc”。 子协议名由JDBC驱动程序的编写者决定。 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。 几种常见的数据库连接 oracle驱动:oracle.jdbc.driver.OracleDriverURL:jdbc:oracle:thin:@machine_name:p...

iOS 本地存储四种方法

在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题。将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好。下面介绍⼀一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提 供encodeWithCoder:和init...

拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限

在.net里应用数据库SQL SERVER的调用,有时会出现message:拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限sp_sdidebug这个扩展存储过程是应用在调试时应用的存储过程,在查询分析器里做SQL调试有个前提就是要确保具有执行 sp_sdidebug扩展过程的权限。解决这个问...