GORM Gen使用介绍
// 安装Gen Tool
go install gorm.io/gen/tools/gentool@latest
// (在项目根目录下执行)根据数据库表生成对应仓储层代码
gentool -db mysql -dsn "username:passwd@tcp(db_ip:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local" -outPath ./internal/repo/query -modelPkgName domain -tables "table_1,table_2,table_3"

根据command和图片可以看到,domain和query是生成对应文件的目录,你可以调整指令来自主命名包,这两个包所在的路径是./internal/repo,也可以通过调整指令修改。
go mod引入gorm gen依赖
go get -u gorm.io/gen
使用:
func UserDI() *user_hdl.UserHandler {
q := query.Use(database.MysqlClient)
svc := &user_svc.UserService{Q: q}
hdl := &user_hdl.UserHandler{Service: svc}
return hdl
}
func (s *UserService) GetUsers() ([]*domain.WsjUser, error) {
queryBuilder := s.Q.WsjUser.WithContext(global.Ctx)
fieldModel := s.Q.WsjUser
//first, err := queryBuilder.Where(fieldModel.Status.Eq("active")).First()
//if err != nil {
// return nil, err
//}
users, err := queryBuilder.Where(fieldModel.Status.Eq("active")).Find()
if err != nil {
return nil, err
}
return users, nil
}
func (s *UserService) GetUsers() ([]*domain.WsjUser, error) {
queryBuilder := s.Q.WsjUser.WithContext(global.Ctx)
fieldModel := s.Q.WsjUser
// 组装嵌套括号
conditions := field.And(
field.Or(
fieldModel.Status.Eq("inactive"),
fieldModel.Email.IsNull(),
),
fieldModel.ID.Eq(1),
)
users, err := queryBuilder.Where(conditions).Find()
if err != nil {
return nil, err
}
return users, nil
}
func (s *UserService) QueryUsers(c *gin.Context) ([]*domain.WsjUser, error) {
queryBuilder := s.Q.WsjUser.WithContext(c)
fieldModel := s.Q.WsjUser
var conditions []gen.Condition
// 动态拼接条件示例
if global.Flag {
conditions = append(conditions, fieldModel.ID.Eq(3))
changeFlag()
} else {
// 创建两个或条件
orCon := field.Or(
fieldModel.Email.IsNull(),
fieldModel.Status.Eq("inactive"), // 假设你想添加另一个条件
)
conditions = append(conditions, orCon)
changeFlag()
}
var users []*domain.WsjUser
var err error
if len(conditions) > 0 {
users, err = queryBuilder.Where(conditions...).Find()
} else {
users, err = queryBuilder.Find()
}
if err != nil {
return nil, err
}
return users, nil
}
func changeFlag() {
if global.Flag {
global.Flag = !global.Flag
} else {
global.Flag = !global.Flag
}
}
后记
关于gorm gen,个人认为更像是对MybatisPlus这类orm框架的一种模仿,也违背了Golang轻量的设计,让(操作数据库)写SQL变得复杂且麻烦。
当然优点也不容忽视:比如编译安全,不会出现字段名出错的问题,数据库 Schema 或 Go Model 发生变化时,你只需要重新运行 GORM Gen 命令,不需要(在项目中)一个一个地方改数据库表所对应的结构体。
正如有句话说的那样——复杂度不会消失,只会转移。

浙公网安备 33010602011771号