前言:
一个框架中没有数据库操作是万万不能的,本框架暂时先引入gorm,后续如果gorm使用不顺手的话,就需要考虑基于Golang数据库驱动自己造轮子了
1.引入gorm
// 在 go.mod 中加入
require github.com/jinzhu/gorm v1.9.12
2.在引入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 目录下定义了一个 配置文件:
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 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 中测试控制器中进行使用
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文档