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

前言:

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

引入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// 重新安装

获取 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]

}

在这个文件中定义了一个变量,里面存储数据库的相关配置,下面获取所有数据库配置和单个配置的方法

定义Model

在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 后,函数退出前。如果将释放数据库连接的操作写在获取数据库连接的方法中,将导致此连接还没用就会被释放。

在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()

}

在控制器中使用

在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")

}

原文:https://www.cnblogs.com/zhuchenglin/p/12731078.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值