前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)

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

作者头像
lin_zone
发布2020-04-21 11:29:52
1.7K0
发布2020-04-21 11:29:52
举报
文章被收录于专栏:LIN_ZONELIN_ZONE

前言:

一个框架中没有数据库操作是万万不能的,本框架暂时先引入gorm,后续如果gorm使用不顺手的话,就需要考虑基于Golang数据库驱动自己造轮子了

1.引入gorm

代码语言:javascript
复制
// 在 go.mod 中加入 
require github.com/jinzhu/gorm v1.9.12 

2.在引入gorm的时候可能会遇到crypto 这个资源被墙了,拉取不到,这时候需要手动下载gorm安装,

代码语言:javascript
复制
cd $PATH/pkg/mod/cache/download/golang.org/x/ 
git clone  https://github.com/golang/crypto.git 
go mod download				// 重新安装 

获取 MySQL 配置 关于MySQL的配置 在conf 目录下定义了一个 配置文件:

代码语言:javascript
复制
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对象,在这个对象上定义了 获取数据库连接和 释放数据库连接的方法

代码语言:javascript
复制
type BaseModel struct {
    dbConnect *gorm.DB
}

func (baseModel BaseModel) getDbConnect() *gorm.DB {
    var err erro
    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 中测试控制器中进行使用

代码语言:javascript
复制
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 中 直接调用就可以了

代码语言:javascript
复制
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文档

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档