代码地址,db分支:https://gitee.com/lsjWeiYi/go-admin/tree/db/
web系统到现在还不能连接数据库。作为核心部件,该实现了。
其实网上使用gorm实现db挺容易的,但是go-admin封装得很复杂,特别是查询的时候,它不用常见的查询方式,使用的那种方式,多少有点难理解。
代码实现过程
修改配置文件
添加以下内容:
database:
# 数据库类型 mysql,sqlite3, postgres
driver: mysql
# 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms
source: root:Lsjweiyi123.@tcp(120.25.238.155:3306)/go_admin?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms
初始化
首先呢,需要在cmd/api/server.go里添加代码初始化,这一步是初始化gorm,然后添加到全局变量(go-admin封装好了),之后调用,都是使用的这个对象,而不是再次初始化。
//1. 读取配置
config.Setup(
file.NewSource(file.WithPath(configYml)), // 读取配置文件
database.Setup, // 数据库初始化
)
这一步需要添加代码:
ps:在这一步,我发现使用go mod tidy,它添加的依赖是:
gorm.io/driver/mysql v1.0.3
然后go build会报错:
C:\Users\Administrator\go\pkg\mod\gorm.io\driver\mysql@v1.0.3\migrator.go:220:24: cannot use column (type Column) as type gorm.ColumnType in append:
Column does not implement gorm.ColumnType (missing AutoIncrement method)
看了一圈不知道问题在哪,以为我漏了哪里的代码,但是查询无果,偶然间升级版本,不再报错:
gorm.io/driver/mysql v1.3.2
感觉像是bug。
添加中间件
这一步,它的流程是这样,每当http请求进来,它都在gin.Context对象里添加一个对DB的指针,然后在接口层就可以通过引用该指针去连接数据库。
这个逻辑可以从它的代码:github.com\go-admin-team\go-admin-core\sdk@v1.3.10\pkg\utils.go中找到代码解释:
// GetOrm 获取orm连接
func GetOrm(c *gin.Context) (*gorm.DB, error) {
idb, exist := c.Get("db") // 这里就是获取中间件添加的那个指针
if !exist {
return nil, errors.New("db connect not exist")
}
switch idb.(type) {
case *gorm.DB:
//新增操作
return idb.(*gorm.DB), nil
default:
return nil, errors.New("db connect not exist")
}
}
添加中间件同样是在那个init.go中:
// 数据库链接
r.Use(WithContextDb)
需要的文件是:
PS: 个人认为, 这里的设计不是很合理,怎么把指针绑定在gin.Context里呢。这样不就把他们耦合起来了吗?仅仅个人观点。
到此,依赖及初始化的配置完成了,下面写代码看看效果。