gorm再封装(gormx)
gorm本身是一个非常优秀并且友好的 ORM 组件。为什么要在它上面再封装一层呢?因为gorm太过强大和灵活,而我们在实际工程中,往往只需要用到它的某种配置搭配,以及大多情况下只会用到它的若干接口,并且是有限的几种用法。所以,封装一层,把团队习惯的配置搭配和接口用法包装出来,会使得写业务代码时更加轻松,更加快速。另外,还可以增加新的特性,从而更好的支持框架的设计。
以下分几点来看:
连接数据库
连接数据库需要在工程里暴露若干配置项,它是gorm的配置项的子集,比如:数据库类型,DSN,日志level等。另外有些配置项,可以写死在代码里作为默认配置,比如 SkipDefaultTransaction=true,PrepareStmt=false,TranslateError=true等。
参见 pkg/gormx/connect.go
。
支持事务嵌套
gorm原生的数据库事务的写法有两种,而要支持事务嵌套的话,必须使用闭包的写法。在这个写法里,作为传递介质的是 *gorm.DB
实例。
然后,框架期望借助golang最常见的context来传递,所以在gormx里封装出来一个新的 DB 对象,支持新的 Transaction
接口,通过 context 来传递数据库句柄。 参见 pkg/gormx/db.go
。
数据库查询接口
gorm的数据库查询接口是链式调用的模式,但我们在写业务逻辑的时候,往往通过slice类型数据结构更便于操作查询条件的组合。所以,gormx封装成了组合option的调用模式。 参见 pkg/gormx/option.go
,也可以阅读 gen/repo
里的代码,了解option的用法。